jpt*_*jpt 4 c malloc printf pointers
我打印错了吗?
#include <stdio.h>
#include <stdlib.h>
int
main( void )
{
int * p = malloc(100000);
int * q;
printf("%p\n%p\n", (void *)p, (void *)q);
(void)getchar(); /* to run several instances at same time */
free(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
无论是顺序运行还是同时运行多个终端,它总是打印"0x60aa00000800" p(q虽然不同).
编辑:谢谢你的答案,我感到困惑的原因之一是因为它曾经每次打印一个不同的地址.事实证明,我开始使用的新编译器选项-fsanitize=address导致了这种变化.哎呦.
值q是未初始化的垃圾,因为您从未为其分配值.
p每次运行程序时都获得相同的地址就不足为奇了.该地址几乎肯定是一个虚拟地址,因此它仅适用于当前运行的程序(进程)的内存空间.
虚拟地址0x60aa00000800从一个程序和虚拟地址看作0x60aa00000800从另一程序所看到是不同的物理地址.操作系统将虚拟地址映射到物理地址,反之亦然,因此没有冲突.(如果不同的程序可以读取和写入相同的物理内存,那将是一场安全噩梦.)
如果它们每次都不同,也就不足为奇了.例如,某些操作系统随机化堆栈地址以防止某些代码漏洞.我不确定堆地址是否也是随机的,但它们当然可以.
https://en.wikipedia.org/wiki/Virtual_memory