有人可以解释为什么我会得到分段错误11吗?

Mar*_*Man 3 c

这是我的代码:

int main() {

    typedef struct {

        int recordCount;
        char *firstName;
        char *secondName;
        char *id;
        char *email;

    }student;

    student *students = malloc(sizeof(*students));

    int i = 0;

    while (students[i].firstName[0] != '.'){

        students[i].firstName = (char *)malloc(sizeof(char*));
        scanf("%s", students[i].firstName);
        i++;
        students = realloc(students, sizeof(students) * (i + 1));

    }
}
Run Code Online (Sandbox Code Playgroud)

当我通过for循环运行它时,它很有效,我很确定这只是我的while循环中的一些愚蠢行为.

dbu*_*ush 5

malloc返回一块未初始化的内存.所以students[i].firstName是一个未初始化的指针,您尝试取消引用.读取和取消引用未初始化的指针会调用未定义的行为,在这种情况下会表现为崩溃.

当你分配的空间firstName会员,您只分配sizeof(char*)它字节,这是一个指针的大小,你想读一个字符串不一定长度.

创建一个缓冲区以将字符串读取到足以满足您可能需要的范围,然后使用strdup创建副本以分配给相关指针.

student *students = NULL;
int i = 0;
char str[100];

scanf("%99s", str);
while (str[0] != '.'){
    students = realloc(students, sizeof(*students) * (i+1));
    students[i].firstName = strdup(str);
    i++;

    scanf("%99s", str);
}
Run Code Online (Sandbox Code Playgroud)