我想在这里简单地为
feld[N]
添加一个元素,但我不知道如何做。我在 Internet 上搜索帮助,但没有任何帮助。如果有人能给我一两个提示,那就太棒了。
可能是我没有正确使用
realloc()
,但我不确定。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_LEN 50
#define N 20
struct student {
unsigned int nummer;
char name[MAX_NAME_LEN];
};
typedef struct student student_t;
int element_vergleich(const void* p1, const void* p2)
{
student_t* sp1, * sp2;
sp1 = (student_t*)p1;
sp2 = (student_t*)p2;
if (sp1->nummer < sp2->nummer)
return -1;
else if (sp1->nummer > sp2->nummer)
return 1;
else
return 0;
}
void sortiere(student_t* f, int n)
{
qsort(f, n, sizeof(student_t), element_vergleich);
}
int main(void)
{
student_t feld[N] = { {59112, "Peter Lustig"}, {45181, "Fritz Fuchs"}, {38984, "Bibi Blocksberg"},
{87191, "Bernd Brot"}, {58731, "Katie Sommer"}, {75442, "Hein Klug"} };
int n = 6; // Anzahl benutzter Elemente im Feld
printf("Das Feld wurde fuer %d Elemente deklariert. Davon werden %d Elemente benutzt.\n", N, n);
int i;
for (i = 0; i < n; i++)
{
printf("Element [%d]: Matrikelnummer: %d\tName Student: %s\n", i + 1, feld[i].nummer, feld[i].name);
}
printf("Geben Sie einen neuen Student_t Element ein.\n");
printf("Geben Sie Matrikelnummer ein: ");
scanf("%d", &feld->nummer);
printf("Geben Sie Name des Studenten ein: ");
scanf("%s", &feld->name);
int* ptr;
ptr = realloc(ptr, sizeof(student_t) * 7);
feld[7].name = { "Linas Dagys" };
feld[7].nummer) = 50846;
return 0;
}
此代码错误:
int* ptr;
ptr = realloc(ptr, sizeof(student_t) * 7);
int* ptr;
定义了 ptr
但没有赋予它任何值。当ptr
传递给realloc
时,它的值是不确定的。您应该传递 realloc
一个值,该值要么是空指针,要么是指向先前分配的内存的指针(先前调用 malloc
、realloc
或相关例程返回的地址)。
函数内部,
student_t feld[N] = …;
定义了一个自动存储时长的数组。这不是 realloc
打算改变的东西。要使用大小可能会改变的数组,您应该使用 malloc
、realloc
或相关例程为其分配空间,之后您可以使用 realloc
请求更改分配。
您不需要从定义的数组开始,而是从一个指针开始,您通过调用
malloc
、realloc
或相关例程为其赋值。 (您可以使用 realloc
通过向其传递一个空指针来进行初始分配。)指针的类型应该是指向数组中所需元素类型的指针 (student_t
)。 int *
不是处理 student_t
结构数组的正确类型。
然后你可以用数据填充分配的内存,你可以从定义和初始化的数组或通过其他方式复制它。
一旦你有了这个数组,你就可以使用
realloc
来改变它的大小。
对于初学者,你有一个错字:
feld[7].nummer) = 50846;
^^^^
在此声明中:
student_t feld[N] = { {59112, "Peter Lustig"}, {45181, "Fritz Fuchs"}, {38984, "Bibi Blocksberg"},
{87191, "Bernd Brot"}, {58731, "Katie Sommer"}, {75442, "Hein Klug"} };
由于常量
20
定义为,所以您声明了一个包含
N
个元素的数组
#define N 20
只有
6
数组元素被显式初始化。数组的所有其他元素都由零隐式初始化。
数组初始化元素的索引是
[0,5]
.
因此,如果您想显式分配数组的另一个元素,则无需“重新分配”数组。数组不能重新分配。它具有自动存储期限,而不是分配的存储期限。
这段代码片段
int* ptr;
ptr = realloc(ptr, sizeof(student_t) * 7);
调用未定义的行为,因为在调用
ptr
时使用的指针 realloc
未初始化。其次,代码片段在任何情况下都没有意义,因为指针 ptr
除了这个代码片段外没有任何地方使用,并且与声明的数组没有任何共同之处。
您只需为数组
feld
的元素赋值,索引为6
.
注意数组没有赋值运算符。要将字符串存储在字符数组中,您需要将其复制到数组中。
所以你应该写:
#include <string.h>
//...
strcpy( feld[6].name, "Linas Dagys" );
feld[6].nummer) = 50846;
如果你想动态重新分配一个数组,那么最初你需要使用函数动态分配它
malloc
.
我知道 realloc() 函数有一些问题,所以我建议您创建另一个使用 malloc 而不是 realloc 的专用函数或循环。 还有一些语法错误,例如“feld[7].nummer)”末尾的括号。