使用FILE变量的地址和C中的FILE*有什么区别?

Kar*_*eem 3 c file-io pointers

给出以下简短的例子

FILE *p = fopen("foo.txt", "r");
FILE f = *p;

int i;
fscanf(p, "%i", &i); // works just fine
fscanf(&f, "%i", &i); // segmentation fault
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些FILE,FILE *以及实际的结构类型_IO_FILE,但我不清楚在第二次调用中导致分段错误的原因是什么fscanf.

除了p&f包含不同的地址之外,除非涉及到这一点(我认为是这样),在这种情况下&f和之间有什么区别p

n. *_* m. 6

C标准(C99 7.19.3/6,C11 7.21.3/6)说:

用于控制流的FILE对象的地址可能很重要; FILE对象的副本不需要代替原始对象.

所以你被警告过了.

  • 从C11开始,`FILE`可能是一个不完整的类型,因此甚至不可能定义一个`FILE`对象.C11说`FILE`是一个"对象类型"; C11将"对象类型"的定义更改为包含不完整类型.请注意,`fpos_t`必须是"完整对象类型",因此更改似乎是故意的. (2认同)