Зачем вам использовать структуру как char * при использовании fread в c? - PullRequest
1 голос
/ 03 декабря 2009

Допустим, у меня есть структура "Пассажир", в которой есть поле для имени.

Если я это сделаю (как показывает синтаксис моей книги):

fread(&passenger, sizeof(Passenger), 1, in_fp);
printf("%s", (*passenger).first_name)

Я получаю ошибку сегментации, но если я это сделаю:

fread( (char *)passenger, sizeof(Passenger), 1, in_fp);
printf("%s", (*passenger).first_name)

имя, прочитанное из файла, будет распечатано.

Ответы [ 3 ]

8 голосов
/ 03 декабря 2009

Мне кажется, что «пассажир» - указатель. Если вы берете & пассажира, вы передаете адрес указателя в Fread. Когда вы разыгрываете его, вы говорите fread, что он должен обращаться с ним как с указателем на буфер символов, а не с указателем на Passenger.

3 голосов
/ 03 декабря 2009

В ранние времена языка C у C не было типа void * (он появился позже, фактически был заимствован из C ++), и вместо него использовался тип char * в качестве общего типа указателя «сырой памяти». Таким образом, даже по сей день вы можете увидеть это обычное элементарное использование типа char * в качестве универсального типа указателя в коде и увидеть другие типы указателей, явно преобразованные в char * в контексте универсального указателя. Я предполагаю, что код, который вы цитировали, делает это по этой конкретной причине. (Если только вы не поставили этот char * актерский состав там. В этом случае я могу только спросить «Почему?».)

В современном C первый параметр fread имеет тип void *, что означает, что приведение не требуется. Это

fread(passenger, sizeof *passenger, 1, in_fp);

будет работать так же хорошо.

Ваша версия &passenger не имеет смысла, поскольку, очевидно, первоначальная цель заключалась в том, чтобы считывать данные в местоположение, на которое указывает passenger, а не в сам объект-указатель passenger.

3 голосов
/ 03 декабря 2009

Возможно, у вас есть указатель на Пассажира, а не Пассажира:

fread(passenger, sizeof(Passenger), 1, in_fp); printf("%s", (*passenger).first_name)

Скорее всего будет делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...