gpt4 book ai didi

c - C中的FILE和不同的输出

转载 作者:行者123 更新时间:2023-12-04 08:24:53 24 4
gpt4 key购买 nike

#include <stdio.h>

int main(void){
FILE *fp = fopen("loop.txt" , "r");
printf("%p\n",fp);
}
输出 :
运行 1:0x101d010
运行 2:0x13f9010
运行 3:0xeaf010

为什么每次输出都不一样?

最佳答案

fopen()函数调用返回一个指向 FILE 的指针“描述”文件的结构,根据操作系统需要什么来访问磁盘上的文件。那FILE结构将位于内存中的某个位置(在运行时分配);该内存块的实际位置(地址)在程序的不同运行之间会有所不同——这正是您需要在 fp 中跟踪它的原因。 (指针)变量。
访问该文件的所有其他对库函数的调用(例如 fwrite()fread()fclose() )都需要 fp变量作为参数;这向函数(和系统)指示您正在使用哪个文件对象。
做一个权威详细的解释为什么您的程序在文件指针中接收到不同的地址,每次运行它时,都需要同样详细和权威的关于您系统的 fopen() 实现的知识。调用(和相关的 I/O 支持代码)——这是我没有的知识。
但是,这里有两种可能的解释:

  • 每次调用fopen() ,系统为所需的FILE分配空间通过调用 malloc(sizeof(FILE)) 构建结构;这将返回足够大小的第一个可用系统内存块的地址,这将在运行之间明显不同,具体取决于其他程序和/或服务正在使用系统的内存池。
  • I/O 子系统有一个固定的内部表 FILE结构,每个都有其(固定的)起始地址;当您调用 fopen() ,系统将第一个可用的表条目分配给您打开的文件,并且该函数返回该文件的地址。但这也可能因运行而异,具体取决于其他程序/服务正在使用该表中的条目。

  • 如果我不得不猜测(仅此而已),那么您在示例中显示的地址之间的巨大差异将使我倾向于第一种可能性。但是您的系统还有许多其他方式可以处理该任务。

    关于c - C中的FILE和不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65309875/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com