假设我有一个“Passenger”结构,它有一个名称字段。
如果我这样做(就像我的书的语法一样):
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)
将打印出从文件中读取的名称。
答案 0 :(得分:8)
向我看,好像'乘客'是一个指针。如果你带上&乘客,你将指针的地址传递给fread。当你施放它时,你告诉fread将它视为指向char缓冲区的指针而不是指向Passenger的指针。
答案 1 :(得分:3)
你可能有一个指向乘客的指针,而不是乘客:
fread(passenger, sizeof(Passenger), 1, in_fp); printf("%s", (*passenger).first_name)
很可能会做你想做的事。
答案 2 :(得分:3)
在C语言的早期,C没有void *
类型(它后来出现,实际上是从C ++借来的)而类型char *
被用作通用的“原始内存”指针类型。因此,即使到今天,您可能会在代码中看到这种习惯性的基本类型char *
的基本使用作为通用指针类型,并且可以看到在通用指针上下文中显式转换为char *
的其他指针类型。我猜你引用的代码是出于特定原因而做的。 (除非是你把这个char *
施放在那里。在那种情况下我只能问“为什么?”。)
在现代C中,fread
的第一个参数具有void *
类型,这意味着不需要强制转换。此
fread(passenger, sizeof *passenger, 1, in_fp);
同样也可以。
您的&passenger
版本毫无意义,因为显然最初的意图是将数据读入指向passenger
的位置,而不是指向passenger
指针对象本身。