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