我有一个程序,从键盘获取信息并将它们放入结构中,然后将结构写入文件。
但是,当我第二次重新分配内存时,它似乎无缘无故地失败了。另外,如果我输入超过1个人的信息,程序最终会失败,并出现seg错误。如果我只输入 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, "%dn", (listofperson+i)->num );
}
fclose(myfile);
myfile = NULL;
free(listofperson);
}
首先,那些说 realloc() 不能与 NULL 指针一起使用的人并没有说实话。该行为记录在这里用于C++,此处记录用于 C,在传递 NULL 指针的情况下,它的工作方式类似于 malloc()。尽管我同意以这种方式分配内存是一种不好的做法。
您没有检查 malloc() 和 realloc() 调用中的错误,它们不能保证成功,因此您不应该假设它们会成功。
在这种情况下,您不应该将指向 person 节点的点命名为"人员列表",因为此约定可能会与链表混淆。我强烈建议您尝试为这种编程案例实现链表,因为无论如何,这基本上就是您处理数据的方式。有关链表的教程,请参阅此链接。
您应该在 fopen() 中更改文件的名称以包含.txt扩展名。否则,系统将不知道文件类型是什么。
更改
struct person {
char fname[20];
char lname[20];
int num;
};
自
struct person {
char fname[50];
char lname[50];
int num;
};
这太小了,欧阿已经指出了。有必要调整一个的值。
错误消息指示内存在超出安全区域之外被破坏。