Intereting Posts

Как получить доступ к членам структур за пределами своей исходной функции?

Я работаю над проектом, где я создаю структуры внутри отдельной функции, чем 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() память, чтобы избежать утечки памяти .


Тем не менее,

  1. Вы никогда не проверяли успех fopen() или fscanf() . Если любой из них не удался, то, как правило, это идеальный сценарий для вызова UB.
  2. while ( !feof (fp) ) плохо
  3. Арифметика указателей (-ов) в вашем коде (есть) бессмысленна .
  4. У вас есть синтаксические ошибки … и, возможно, больше.