在c中使用fread时,为什么要将结构转换为char *?

时间:2009-12-03 00:16:32

标签: c

假设我有一个“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)

将打印出从文件中读取的名称。

3 个答案:

答案 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指针对象本身。