gpt4 book ai didi

c - 段错误和 realloc() : invalid next size:

转载 作者:行者123 更新时间:2023-11-30 18:57:10 24 4
gpt4 key购买 nike

我有一个程序,从键盘获取信息并将它们放入一个结构中,然后将该结构写入文件。

但是,当我第二次重新分配内存时,它似乎无缘无故地失败了。另外,如果我输入超过 1 个人的信息,程序最终会因段错误而失败。如果我只输入 1 个人的信息,程序就可以正常运行。

谢谢。

// Program 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

typedef struct person person;

struct person {
char fname[20];
char lname[20];
int num;
};

int main(void){
int size = 0;
int count = 0;
person* listofperson = NULL;
char answer = 'n';
FILE* myfile;

do{
char* buf = (char*)malloc(sizeof(char)*50);
printf("Please enter the person's first name: \n");
fgets(buf, 50, stdin);
if(count == size){
size += 2;
listofperson = (person*)realloc(listofperson, (size_t)(sizeof(person)*size));
}
strncpy((listofperson+count)->fname, buf, 50);
printf("Please enter the person's last name: \n");
fgets(buf, 50, stdin);
strncpy((listofperson+count)->lname, buf, 50);
printf("Please enter the person's number: \n");
fgets(buf, 50, stdin);
sscanf(buf, "%d", &((listofperson+count)->num));
free(buf);
count++;
printf("Do you want to enter another one?\n");
answer = getchar();
getchar();
}while(tolower(answer) != 'n');

myfile = fopen("myfile", "a");
for(int i = 0; i < count; i++){
fprintf(myfile, "%s", (listofperson+i)->fname );
fprintf(myfile, "%s", (listofperson+i)->lname );
fprintf(myfile, "%d\n", (listofperson+i)->num );
}
fclose(myfile);
myfile = NULL;
free(listofperson);
}

最佳答案

一方面,那些说 realloc() 不适用于 NULL 指针的人并没有说实话。该行为已记录here对于 C++ 和 here对于 C,它在传递 NULL 指针的情况下就像 malloc() 一样工作。尽管我同意以这种方式分配内存是不好的做法。

您不会检查 malloc() 和 realloc() 调用中的错误,不能保证它们会成功,因此您不应假设它们会成功。

在这种情况下,您不应将您的点命名为人员节点“人员列表”,因为此约定可能会与链接列表混淆。我强烈建议您尝试为这个编程案例实现一个链接列表,因为这基本上就是您处理数据的方式。有关链接列表的教程,请参阅此 link .

您应该在 fopen() 中更改文件名以包含 .txt 扩展名。否则系统将不知道文件类型是什么。

关于c - 段错误和 realloc() : invalid next size:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21947131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com