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

在C中使用文件变量和文件*的地址有什么区别?,c,pointers,file-io,C,Pointers,File Io,给出以下简短示例 FILE *p = fopen("foo.txt", "r"); FILE f = *p; int i; fscanf(p, "%i", &i); // works just fine fscanf(&f, "%i", &i); // segmentation fault 我已经读了一些关于文件,文件*以及实际结构类型\u IO\u文件,但我并不清楚是什么导致了对fscanf的第二次调用中的分段错误 这样,除了包含不同地址的 P 和和F 之外,如果不

给出以下简短示例

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

int i;
fscanf(p, "%i", &i); // works just fine
fscanf(&f, "%i", &i); // segmentation fault
我已经读了一些关于
文件
文件*
以及实际结构类型
\u IO\u文件
,但我并不清楚是什么导致了对
fscanf
的第二次调用中的分段错误


这样,除了包含不同地址的<代码> P <代码>和<代码>和F <代码>之外,如果不涉及这一点(我想是这样),那么<>代码> f>代码>和<代码> p>代码>在这方面有什么区别?

< p>您可以考虑<代码>文件*/COD>作为一个Seluto Lato,你不应该尝试做你正在做的事情。 发件人:

C流是类型为
std::FILE
的对象,只能通过类型为
std::FILE*
(注意:虽然可以通过取消引用和复制有效的
std::FILE*
来创建类型为
std::FILE
的本地对象,但在I/O函数中使用此类副本的地址是未定义的行为)。

C标准(C99 7.19.3/6、C11 7.21.3/6)规定:

用于控制流的文件对象的地址可能很重要;文件对象的副本不必代替原始文件


所以你已经被警告了。

C中没有
std::
。明白了!我可以在任何地方找到更多关于这方面的信息吗?比如说,这背后的意义是有一个未定义的行为,而不是想当然地认为这是理所当然的?C标准及其基本原理是一个很好的地方(参见.)是另一个很好的来源。从C11开始,
文件
可能是一个不完整的类型,因此甚至可能无法定义
文件
对象。C11说
文件
是一个“对象类型”;C11更改了“对象类型”的定义以包括不完整的类型。请注意,
fpos\u t
必须是一个对象类型“完整对象类型”,因此更改似乎是故意的。