Я работаю над проектом, где я создаю структуры внутри отдельной функции, чем main()
. После создания и добавления информации о члене (переменной) в структурную переменную мне нужно будет return
указатель на структуру, в которой я могу получить к ней доступ для ссылки и печати.
Я включаю свой код и прошу вас как можно проще, поскольку я новичок в структурах.
#include #include #include 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; }
Чтобы ответить на главный вопрос в вашем сообщении, в функции Car* readCars(char* filename)
, вы сохраняете адрес локальной переменной в указателе
carptr = &car1;
а затем попытаться return
его
return carptr;
В этом случае, как только readCars()
завершит выполнение, существование car
будет прекращено, и вы вызовете неопределенное поведение , обратившись к возвращенному указателю.
Если вы хотите, чтобы память была действительной даже вне области ее распределения (в данном случае, внешней функции readCars()
), вам необходимо выделить то же самое с использованием распределения динамической памяти, например, malloc()
и family.
FWIW, как только вы закончите использовать возвращаемый указатель, вам также необходимо free()
память, чтобы избежать утечки памяти .
Тем не менее,
fopen()
или fscanf()
. Если любой из них не удался, то, как правило, это идеальный сценарий для вызова UB. while ( !feof (fp) )
плохо