Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 文件和不同的输出 #包括 内部主(空){ 文件*fp=fopen(“loop.txt”、“r”); printf(“%p\n”,fp); }_C - Fatal编程技术网

C 文件和不同的输出 #包括 内部主(空){ 文件*fp=fopen(“loop.txt”、“r”); printf(“%p\n”,fp); }

C 文件和不同的输出 #包括 内部主(空){ 文件*fp=fopen(“loop.txt”、“r”); printf(“%p\n”,fp); },c,C,输出: #include <stdio.h> int main(void){ FILE *fp = fopen("loop.txt" , "r"); printf("%p\n",fp); } 运行1:0x101d010 运行2:0x13f9010 运行3:0xeaf010 为什么每次输出都不同?函数调用fopen()返回指向文件的指针,该文件的结构“描述”了操作系统访问磁盘上文件所需的内容。文件结构将位于

输出:

#include <stdio.h>

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

函数调用
fopen()
返回指向
文件的指针,该文件的结构“描述”了操作系统访问磁盘上文件所需的内容。
文件
结构将位于内存中的某个位置(在运行时分配);该内存块的实际位置(地址)在程序的不同运行期间会有所不同-这正是您需要在
fp
(指针)变量中跟踪它的原因

访问该文件的所有其他库函数调用(如
fwrite()
fread()
fclose()
)都需要该
fp
变量作为参数;这向函数(和系统)指示您正在使用的文件对象

要对为什么给出权威和详细的解释,您的程序每次运行时都会在文件指针中接收到不同的地址,需要同样详细和权威地了解系统对
fopen()
调用的实现(以及相关的I/O支持代码)–这是我所没有的知识

然而,这里有两种可能的解释:

  • 每次调用
    fopen()
    ,系统都会通过调用
    malloc(sizeof(FILE))
    为所需的
    文件
    结构分配空间;这将返回足够大小的第一个可用系统内存块的地址,这在运行期间会明显不同,具体取决于使用系统内存池的其他程序和/或服务

  • I/O子系统有一个固定的、内部的
    文件表
    结构,每个结构都有其(固定的)起始地址;调用
    fopen()
    时,系统会将第一个可用的表条目分配给打开的文件,函数会返回该文件的地址。但这也可能因运行而异,具体取决于其他程序/服务使用该表中的条目


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

    为什么您认为它应该始终是相同的值?答案可能是。@Damien抱歉,我没有答案User14528249为什么指针值很重要?为什么你关心的是相同的还是不同的运行?@ CuxReStimeMeNICA让我们考虑好奇心,为什么每次输出都不一样?ASLR!这以前不是真的,调试路径每次都以完全相同的方式可靠地损坏堆。位置是否保存在虚拟内存中?我对计算机体系结构不熟悉,有人问我“为什么每次输出都不同?”因此,我试图得到一个更清晰、更全面的答案谢谢你的清晰回答,但如果有更多细节,我希望你能写出来我在等你给了我一个非常好的想法,我可以根据这个解释来回答。谢谢你的回答 Run 1 : 0x101d010 Run 2 : 0x13f9010 Run 3 : 0xeaf010