我正在开发一个项目,我在一个单独的函数中创建结构而不是main()
。在创建并将成员(变量)信息添加到结构变量之后,我需要能够return
指向我可以访问它以供参考和打印的结构的指针。
我包含了我的代码,请尽可能简单,因为我是结构新手。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct _car
{
char color[20];
char model[20];
char brand[20];
int year;
struct _car *eptr;
} Car;
Car* readCars(char* filename);
/*
*
*/
int main(int argc, char** argv) {
Car *Cars;
Car *eptr;
Cars = readCars(argv[1]);
printf("%s%s%s%s", Cars->color, Cars->brand, Cars->model, Cars->color);
return (EXIT_SUCCESS);
}
Car* readCars(char* filename)
{
FILE *file = fopen(filename, "r");
int year;
char color [20], model [20], brandx[20];
Car car1;
Car car2;
Car *carptr;
Car *car2ptr;
if (file == NULL)
{
printf("File cannot be opened\n");
}
while(file != EOF)
{
fscanf(file, "%s%s%s%d", color, model, brandx, &year);
strcpy(car1.color, color);
strcpy(car1.model, model);
strcpy(car1.brand, brandx);
car1.year = year;
carptr = &car1;
fscanf(file, "%s%s%s%d", color, model, brandx, &year);
strcpy(car2.color, color);
strcpy(car2.model, model);
strcpy(car2.brand, brandx);
car2.year = year;
car2ptr = &car2;
if (fscanf(file, "%s%s%s%d", color, model, brandx, &year) == EOF)
{
break;
}
}
return carptr;
}
答案 0 :(得分:6)
要回答帖子中的主要问题,在Car* readCars(char* filename)
函数中,您将局部变量的地址存储到指针中
carptr = &car1;
然后尝试return
return carptr;
在这种情况下,只要readCars()
函数完成执行,car
的存在就会停止,你将通过访问返回的指针来调用undefined behaviour。
如果您希望内存在其分配范围之外有效(在本例中,在readCars()
函数之外),则需要使用动态内存分配来分配内存,例如{{3}和家人。
FWIW,一旦你完成了使用返回的指针,你还需要malloc()
内存以避免free()
。
那就是说,
fopen()
或fscanf()
的成功。如果其中任何一个失败,则继续正常是调用UB的理想方案。