我打印错了吗?
#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;
}
无论我是顺序运行还是同时在多个终端运行,它总是为 p
打印“0x60aa00000800”(尽管 q
不同)。
编辑:感谢您的回答,我感到困惑的原因之一是它曾经每次打印不同的地址。事实证明,我开始使用的新编译器选项 -fsanitize=address
导致了此更改。糟糕。
最佳答案
q
的值是未初始化的垃圾,因为您从未为其赋值。
每次运行程序时,p
的地址都相同,这并不奇怪。该地址几乎可以肯定是一个虚拟地址,因此它仅适用于当前正在运行的程序(进程)的内存空间。
从一个程序中看到的虚拟地址 0x60aa00000800
和从另一个程序中看到的虚拟地址 0x60aa00000800
是不同的物理 地址。操作系统将虚拟地址映射到物理地址,反之亦然,因此不存在冲突。 (如果不同的程序可以读写相同的物理内存,那将是一场安全噩梦。)
如果它们每次都不同也不足为奇。例如,某些操作系统随机化堆栈地址以防止某些代码漏洞利用。我不确定堆地址是否也是随机的,但它们肯定是可以的。
关于c - 打印 malloc 的指针总是给出相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864399/