加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:22:53 所属栏目:百科 来源:网络整理
导读:这是我的代码: 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
这是我的代码:

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));

    }
}

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

解决方法

malloc返回一块未初始化的内存.因此,student [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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读