我是编程新手,有一个不重要但令人困惑的问题困扰着我。
让我先发布我的代码:
FILE *fp;
int i;
fp=fopen("test_data.txt", "r");
printf("i's address=%p\n", &i);
printf("fp's address =%p\n", fp);
printf("stdout's address=%p\n", stdout);
close(fp);
输出为:
i's address=0x7ffd038ab8cc
fp's address=0x231c010
stdout's address=0x7fbb2e4f7980
我的问题是,为什么fp的地址为28位?它不应该与普通变量和标准输出(48位)相同吗?
我在64位Ubuntu Linux上使用GCC。
感谢您的回答!
fopen
可能会打电话malloc
要求其FILE*
处理。
的某些实现malloc
会在不同的地址空间段中分配不同的“小”对象和“大”对象(通过mmap(2)或syscalls(2)中列出的某些其他系统调用获得)。
在某些实现中,stdout
是指向某些静态数据的指针...
另外,您可能已启用ASLR ...
您可以在运行的进程上使用pmap(1)进行调查。另请参见proc(5) ; 如果有时间,请从/proc/self/maps
程序内部顺序读取各行,然后将其复制到stdout
;还要尝试cat /proc/$$/maps
了解您的Shell的虚拟地址空间是什么。
您也可以strace(1)您的程序以了解它正在执行的许多系统调用。
但是你真的不应该打扰。从C角度来看,地址或多或少是随机的(除非您深入了解实现细节)
(在某些x86-64处理器上,实际上只有48位地址,而最高的16位全为零或全为一。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句