C 将数据写入动态数组时出现分段错误
我的任务是编写一个文件,显示用户输入的未知数量的记录。每个记录都有以下字段:名字、姓氏、地址、城市、州、邮政编码和电话号码 我认为最好的方法是用上面的字段定义一个struct记录,然后声明一个C 将数据写入动态数组时出现分段错误,c,file,struct,segmentation-fault,records,C,File,Struct,Segmentation Fault,Records,我的任务是编写一个文件,显示用户输入的未知数量的记录。每个记录都有以下字段:名字、姓氏、地址、城市、州、邮政编码和电话号码 我认为最好的方法是用上面的字段定义一个struct记录,然后声明一个Records数组,该数组包含用户输入的记录数。为了实现这一点,我将使用一个循环来获取每条记录的每个字段的输入,然后如果用户希望继续在记录数组中动态分配一个额外的空间,并继续,直到用户输入编号。我在第行遇到访问冲突写入位置错误: scanf("%s", records[i]->fname); 我的代
Record
s数组,该数组包含用户输入的记录数。为了实现这一点,我将使用一个循环来获取每条记录的每个字段的输入,然后如果用户希望继续在记录
数组中动态分配一个额外的空间,并继续,直到用户输入编号。我在第行遇到访问冲突写入位置错误:
scanf("%s", records[i]->fname);
我的代码怎么了
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct Record;
struct Record
{
char fname[51];
char lname[51];
char address[51];
char city[51];
char state[51];
int zipcode;
int phoneNumber;
};
int main()
{
FILE *fileWriter;
const char filename[] = "data.txt";
char answer = 'y';
int size = 1;
int i = 0;
struct Record **records;
records = malloc(sizeof(*records)*(size));
while(answer == 'y' || answer == 'Y')
{
printf("First Name: \n");
scanf("%s", records[i]->fname);
printf("Last Name: \n");
scanf("%s", records[i]->lname);
printf("Address: \n");
scanf("%s", records[i]->address);
printf("City: \n");
scanf("%s", records[i]->city);
printf("State: \n");
scanf("%s", records[i]->state);
printf("Zipcode: \n");
scanf("%d", records[i]->zipcode);
printf("Phone Number: \n");
scanf("%d", records[i]->phoneNumber);
//stores all record info
printf("Are there anymore records? [y/n] ");
answer = getchar();
if(answer == 'y' || answer == 'Y')
{
size++;
records[i++];
printf("\n");
}
records = realloc(records,sizeof(*records)*(size));
}
//open file
fileWriter = fopen(filename,"wb");
if(fileWriter != NULL)
{
if(fwrite(records,sizeof(*records),size,fileWriter) != 1)
{
fprintf(stderr, "Failed to write to %s\n", filename);
exit(1);
}
fclose(fileWriter);
}
else
{
printf("Error opening file.");
}
}
#包括
#包括
#包括
结构记录;
结构记录
{
char fname[51];
字符名称[51];
字符地址[51];
查尔城[51];
半焦态[51];
int-zipcode;
整数音素;
};
int main()
{
文件*文件编写器;
const char filename[]=“data.txt”;
char-answer='y';
int size=1;
int i=0;
结构记录**记录;
记录=malloc(sizeof(*记录)*(大小));
while(答案=='y'|答案=='y')
{
printf(“名字:\n”);
scanf(“%s”,记录[i]->fname);
printf(“姓氏:\n”);
scanf(“%s”,记录[i]->lname);
printf(“地址:\n”);
scanf(“%s”,记录[i]->地址);
printf(“城市:\n”);
scanf(“%s”,记录[i]->city);
printf(“状态:\n”);
scanf(“%s”,记录[i]->状态);
printf(“Zipcode:\n”);
scanf(“%d”,记录[i]->zipcode);
printf(“电话号码:\n”);
scanf(“%d”,记录[i]->phoneNumber);
//存储所有记录信息
printf(“还有记录吗?[y/n]”);
答案=getchar();
如果(答案='y'|答案=='y')
{
大小++;
记录[i++];
printf(“\n”);
}
记录=realloc(记录,大小(*记录)*(大小));
}
//打开文件
fileWriter=fopen(文件名,“wb”);
if(fileWriter!=NULL)
{
if(fwrite(记录,sizeof(*记录),大小,fileWriter)!=1)
{
fprintf(stderr,“无法写入%s\n”,文件名);
出口(1);
}
fclose(文件编写器);
}
其他的
{
printf(“打开文件时出错”);
}
}
编辑版本
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct Record
{
char fname[51];
char lname[51];
char address[51];
char city[51];
char state[51];
int zipcode;
int phoneNumber;
};
int main()
{
FILE *fileWriter;
const char filename[] = "data.txt";
char answer = 'y';
int size = 1;
int i = 0;
struct Record *records = NULL;
struct Record *records_temp;
while(answer == 'y' || answer == 'Y')
{
struct Record *records_temp = realloc(records,(size)*sizeof(*records));
if(records_temp == NULL)
{
free(records);
}
records = records_temp;
printf("First Name: \n");
scanf("%s", records[i].fname);
printf("Last Name: \n");
scanf("%s", records[i].lname);
printf("Address: \n");
scanf(" %[^\n]", records[i].address);
printf("City: \n");
scanf("%s", records[i].city);
printf("State: \n");
scanf("%s", records[i].state);
printf("Zipcode: \n");
scanf("%d", &records[i].zipcode);
printf("Phone Number: \n");
scanf("%d", &records[i].phoneNumber);
//stores all record info
printf("Are there anymore records? [y/n] ");
answer = getchar();
if(answer == 'y' || answer == 'Y')
{
size++;
records[i++];
printf("\n");
}
//open file
fileWriter = fopen(filename,"wb");
if(fileWriter != NULL)
{
if(fwrite(records,sizeof(*records),size,fileWriter) != 1)
{
fprintf(stderr, "Failed to write to %s\n", filename);
exit(1);
}
fclose(fileWriter);
}
else
{
printf("Error opening file.");
}
}
}
#包括
#包括
#包括
结构记录
{
char fname[51];
字符名称[51];
字符地址[51];
查尔城[51];
半焦态[51];
int-zipcode;
整数音素;
};
int main()
{
文件*文件编写器;
const char filename[]=“data.txt”;
char-answer='y';
int size=1;
int i=0;
结构记录*记录=NULL;
结构记录*记录温度;
while(答案=='y'|答案=='y')
{
结构记录*records_temp=realloc(记录,(大小)*sizeof(*记录));
如果(记录温度==NULL)
{
免费(记录);
}
记录=记录温度;
printf(“名字:\n”);
scanf(“%s”,记录[i].fname);
printf(“姓氏:\n”);
scanf(“%s”,记录[i].lname);
printf(“地址:\n”);
scanf(“%[^\n]”,记录[i]。地址);
printf(“城市:\n”);
scanf(“%s”,记录[i]。城市);
printf(“状态:\n”);
scanf(“%s”,记录[i]。状态);
printf(“Zipcode:\n”);
scanf(“%d”,&records[i].zipcode);
printf(“电话号码:\n”);
scanf(“%d”,&记录[i]。电话号码);
//存储所有记录信息
printf(“还有记录吗?[y/n]”);
答案=getchar();
如果(答案='y'|答案=='y')
{
大小++;
记录[i++];
printf(“\n”);
}
//打开文件
fileWriter=fopen(文件名,“wb”);
if(fileWriter!=NULL)
{
if(fwrite(记录,sizeof(*记录),大小,fileWriter)!=1)
{
fprintf(stderr,“无法写入%s\n”,文件名);
出口(1);
}
fclose(文件编写器);
}
其他的
{
printf(“打开文件时出错”);
}
}
}
嗯,您会得到一个segfault,因为您没有为记录中的第一个实体分配内存
所以要解决这个问题,你需要
records[size-1] = malloc(sizeof(Records));
换言之:
您有记录
,它是指向记录
的指针。
你什么时候做的
records = malloc(sizeof(*records)*(size));
实际上,您要求提供指向记录的size
指针。
但这还不够,您需要分配另一个内存来存储实际的记录
,所以我们必须这样做
records[size - 1] = malloc(sizeof(Records));
注意:如果大小
>1,则应执行以下操作:
int i = 0;
for(;i < size; i++) {
records[i] = malloc(sizeof(Records));
}
inti=0;
对于(;i
除此之外,为什么要使用Records**
,正如前面所解释的,您应该使用Records*
并修复realloc
的部分,以创建新内存,因为如果realloc
失败,它将返回NULL
,在最坏的情况下,您将导致内存泄漏或另一个segfault,不管怎样,这对你的程序都不好
请参见嗯,您得到了一个segfault,因为您没有为记录中的第一个实体分配内存
所以要解决这个问题,你需要
records[size-1] = malloc(sizeof(Records));
换言之:
您有记录
,它是指向记录
的指针。
你什么时候做的
records = malloc(sizeof(*records)*(size));
实际上,您要求提供指向记录的size
指针。
但这还不够,您需要分配另一个内存来存储实际的记录
,所以我们必须这样做
records[size - 1] = malloc(sizeof(Records));
注意:如果大小
>1,则应执行以下操作:
int i = 0;
for(;i < size; i++) {
records[i] = malloc(sizeof(Records));
}
inti=0;
对于(;i<尺寸;