是什么导致C中带有realloc的Sigtrap崩溃



在我的C程序中,我试图创建一个结构数组。对于内存分配,我试图使其动态化,只要需要就增长,不幸的是,每次它在realloc上崩溃。

void readsaveusers(char* filename, User *users) {
FILE *file;
file = fopen(filename, "r");
if (file == NULL) printf("Error reading filen");
char line[200];
users = malloc(sizeof(struct user *));
for (int i = 0; !feof(file); i++) {
fgets(line, 200, file);
users = realloc(users,sizeof(struct user *) * (i + 1));
char *tok = strtok(line, ";");
strcpy(users[i].username, tok);
tok = strtok(NULL, ";");
strcpy(users[i].name, tok);
tok = strtok(NULL, ";");
users[i].gender = tok[0];
tok = strtok(NULL, "/");
users[i].birth_date.day = atoi(tok);
tok = strtok(NULL, "/");
users[i].birth_date.month = atoi(tok);
tok = strtok(NULL, ";");
users[i].birth_date.year = atoi(tok);
tok = strtok(NULL, "/");
users[i].account_creation.day = atoi(tok);
tok = strtok(NULL, "/");
users[i].account_creation.month = atoi(tok);
tok = strtok(NULL, ";");
users[i].account_creation.year = atoi(tok);
tok = strtok(NULL, ";");
strcpy(users[i].pay_method, tok);
tok = strtok(NULL, ";");
strcpy(users[i].account_status, tok);

}
printf("Saved filen");
fclose(file);
}

这:

users = realloc(users,sizeof(struct user *) * (i + 1));
^
|
|
doh!

为CCD_ 1到CCD_ 2的指针分配内存。假设结构本身大于指向它的指针(一个合理的假设),您将覆盖分配的内存并轰炸。

你的意思是:

void * const np = realloc(users, (i + 1) * sizeof *users);
if (np != NULL)
{
users = np;
}
else
{
fprintf(stderr, "Memory allocation failure, abortingn");
exit(1);
}

注意使用";新指针";(np)变量,以检查分配是否成功。这可以简化,因为在执行exit()来处理错误时,实际上并不需要原始值,但我将其作为示例。

最新更新