我正在尝试创建一个动态列表,但由于某种原因,列表不会增长超过 2 个元素
typedef struct{
char* name;
int age;
} student;
int Insert(void){
int const MAX = 1000;
int age;
char name[MAX];
int i=1;
int const ENOGH = 2;
int const AGE_ERR = 1;
int flag=0;
student** array = NULL;
do{
printf("insert student namen");
printf("user: ");
scanf("%s",name);
if( strcmp(name,"enough") != 0){
printf("insert agen");
printf("user: ");
scanf("%d",&age);
}else{
return ENOGH;
}
if ( age == -1){
flag = AGE_ERR;
}
if (age != AGE_ERR){
array = realloc(array, sizeof(student*)*(i+1));
array[i] = malloc(sizeof(student));
if (array[i] == NULL){
printf("Erorrn");
}
array[i]->name =(char*)malloc(sizeof(char)*(strlen(name)+1));
strcpy(array[i]->name ,name);
array[i]->age = age;
i++;
}
}while (flag != AGE_ERR);
return AGE_ERR;
}
我确定这与重新分配指向列表的指针和列表元素分配有关,但我找不到什么
(而循环永不结束以保存一些代码(
这是
不正确的:
array[i]->name =(char*)malloc(sizeof(strlen(name)));
strlen
函数返回一个int
,所以sizeof(strlen(name))
计算大小为int
。 对于您存储的任何字符串来说,这很可能不够长。
相反,您希望:
array[i]->name = malloc(strlen(name) + 1));
这将为字符串和终止空字节分配空间。 您实际上可以将此行及其后面的strcpy
替换为调用 strdup
:
array[i]->name = strdup(name);