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

时间:2019-02-14 01:17:47

标签: 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));

    }
}

当我通过for循环运行它时,它可以正常工作,我很确定它在while循环中只是愚蠢的事情。

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:3)

首先,

students[i].firstName = (char *)malloc(sizeof(char*));

为字符指针分配足够的空间,通常为四个或八个字节。

虽然其中有些名称会适合 (例如PaxBob),但绝大多数名称可能不会。

您需要为最大的名称(和字符串终止符)分配足够的空间,例如:

#define MAX_NAME_LEN 100
students[i].firstName = malloc(MAX_NAME_LEN + 1);

答案 2 :(得分:0)

您的代码中有很多问题。

  1. 在使用malloc时,实际上是指定data type而不是pointer type,我相信这不是您的意图。如果使用sizeof指定指针类型,则指针将指向具有指针大小的存储位置。在这种情况下,这不是您想要的。
  2. student *students = malloc ...行之后。 students将指向一个存储位置,该位置将在firstName中保存零值。您需要为这些使用malloc。由于未执行此操作,因此会出现分段错误,因为您正在取消引用无效的指针(指向位置0)。您正在尝试先访问它,然后再使用malloc

答案 3 :(得分:-2)

如果您

filter(salesdate %>% between(`Recruitment Date`, `1st Year Since Recruitment`))

您正在分配一个指针的大小。您想做的就是

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

并且出于同样的原因,student *students = malloc(sizeof(students)); 肯定没有足够的内存来存储您的姓名,请尝试students[i].firstName = (char *)malloc(sizeof(char*))左右。