gpt4 book ai didi

c - 请求非结构或 union 中的成员 'x' 和段错误(丢失)

转载 作者:行者123 更新时间:2023-11-30 20:25:30 26 4
gpt4 key购买 nike

//目标:将文件中的数据加载到结构体中

typedef struct {
int year;
char* make;
char* model;
int miles;
} Car;

void fill_garage(Car** garage, char* cars, int* size);

int main(int argc, char** argv)
{
if(argc<3)
{
printf("Not enough arguments.\n");
return 0;
}

int size;
Car** garage;
fill_garage(garage, argv[1], &size);

return 0;
}

void fill_garage(Car** garage, char* cars, int* size)
{
int i;
FILE* inputF=fopen(cars, "r");
fscanf(inputF, "%d", size);
garage=malloc(sizeof(Car)*(*size));
for(i=0; i<(*size); i++)
{
garage[i].make=malloc(sizeof(char)*MAX_STRING_LEN);
garage[i].model=malloc(sizeof(char)*MAX_STRING_LEN);
//The line below causes a segmentation fault when there are no errors
fscanf(inputF, "%d %s %s %d", &garage[i].year, garage[i].make, garage[i].model, &garage[i].miles);
}
}

//我不希望任何人给我正确的代码(尽管那会很好)如果你能指出一个我可以学习指针的资源那就太好了。如果您想查看的话,这是作业表。 http://pastebin.com/LNeCx70m

最佳答案

  1. 您必须将garage的地址传递给fill_garage(),所以这样

    Car** garage;
    fill_garage(garage, argv[1], &size);

    应该是

    Car *garage;
    fill_garage(&garage, argv[1], &size);
    /* ^ pass the address of garage */
  2. 对于固定大小的字符串,您不需要 malloc(),只需重新定义您的结构即可

    typedef struct {
    int year;
    char make[MAX_STRING_LEN];
    char model[MAX_STRING_LEN];
    int miles;
    } Car;
  3. 检查fopen()malloc()返回值,如果失败则返回NULL,如果打开失败文件,那么你将导致未定义的行为。另请检查 fscanf() 的返回值。

  4. printf()fscanf() 以及 stdlib.h 包含 stdio.h对于 malloc()

我修复了你的代码,所以它原则上不会有任何问题

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

#define MAX_STRING_LEN 128

typedef struct {
int year;
char make[MAX_STRING_LEN];
char model[MAX_STRING_LEN];
int miles;
} Car;

void fill_garage(Car **garage, char *cars, int *size);

int main(int argc, char** argv)
{
if (argc < 3)
{
printf("Not enough arguments.\n");
return 0;
}

int size;
Car *garage;

fill_garage(&garage, argv[1], &size);

return 0;
}

void fill_garage(Car **output, char *cars, int *size)
{
int i;
FILE *inputF;
Car *garage;

if (output == NULL)
return;
*output = NULL;
inputF = fopen(cars, "r");
if (inputF == NULL)
return;
if (fscanf(inputF, "%d", size) != 1)
{
fclose(inputF);
return;
}
garage = malloc(sizeof(*garage) * *size);
*output = garage;
if (garage == NULL)
{
fclose(inputF);
return;
}
i = 0;
while ((i < *size) && (fscanf(inputF, "%d%127s%127s%d", &garage[i].year, garage[i].make,
garage[i].model, &garage[i].miles) == 4))
{
i += 1;
}
}

关于c - 请求非结构或 union 中的成员 'x' 和段错误(丢失),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574530/

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