动态数组重新分配

时间:2019-02-04 18:31:07

标签: c malloc

我正在尝试创建一个动态列表,但是由于某种原因,该列表的长度不能超过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 name\n");
        printf("user: ");
        scanf("%s",name);
        if( strcmp(name,"enough") != 0){
            printf("insert age\n");
            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("Erorr\n");
            }
            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;
}

我确信这与指向列表的指针的重新分配和列表元素的分配有关,但是我找不到什么

(while循环永远不会结束以保存一些代码)

1 个答案:

答案 0 :(得分:1)

这是不正确的:

 array[i]->name =(char*)malloc(sizeof(strlen(name)));

strlen函数返回一个int,因此sizeof(strlen(name))的计算结果为int的大小。对于您存储的任何字符串,这很可能不够长。

您反而想要:

 array[i]->name = malloc(strlen(name) + 1));

这将为字符串 plus 的终止空字节分配空间。您实际上可以用对strcpy的调用来替换此行及其后的strdup

 array[i]->name = strdup(name);