这是我的代码:
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循环中只是愚蠢的事情。
答案 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*));
为字符指针分配足够的空间,通常为四个或八个字节。
虽然其中有些名称会适合 (例如Pax
或Bob
),但绝大多数名称可能不会。
您需要为最大的名称(和字符串终止符)分配足够的空间,例如:
#define MAX_NAME_LEN 100
students[i].firstName = malloc(MAX_NAME_LEN + 1);
答案 2 :(得分:0)
您的代码中有很多问题。
malloc
时,实际上是指定data type
而不是pointer type
,我相信这不是您的意图。如果使用sizeof
指定指针类型,则指针将指向具有指针大小的存储位置。在这种情况下,这不是您想要的。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*))
左右。