C语言 分段错误和 realloc():下一个大小无效:



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

但是,当我第二次重新分配内存时,它似乎无缘无故地失败了。另外,如果我输入超过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;
};

这太小了,欧阿已经指出了。有必要调整一个的值。

错误消息指示内存在超出安全区域之外被破坏。

相关内容

  • 没有找到相关文章

最新更新