Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数据写入动态数组时出现分段错误_C_File_Struct_Segmentation Fault_Records - Fatal编程技术网

C 将数据写入动态数组时出现分段错误

C 将数据写入动态数组时出现分段错误,c,file,struct,segmentation-fault,records,C,File,Struct,Segmentation Fault,Records,我的任务是编写一个文件,显示用户输入的未知数量的记录。每个记录都有以下字段:名字、姓氏、地址、城市、州、邮政编码和电话号码 我认为最好的方法是用上面的字段定义一个struct记录,然后声明一个Records数组,该数组包含用户输入的记录数。为了实现这一点,我将使用一个循环来获取每条记录的每个字段的输入,然后如果用户希望继续在记录数组中动态分配一个额外的空间,并继续,直到用户输入编号。我在第行遇到访问冲突写入位置错误: scanf("%s", records[i]->fname); 我的代

我的任务是编写一个文件,显示用户输入的未知数量的记录。每个记录都有以下字段:名字、姓氏、地址、城市、州、邮政编码和电话号码

我认为最好的方法是用上面的字段定义一个struct记录,然后声明一个
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<尺寸;