打印malloc指针始终提供相同的地址

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导致了这种变化.哎呦.

Kei*_*son 6

q是未初始化的垃圾,因为您从未为其分配值.

p每次运行程序时都获得相同的地址就不足为奇了.该地址几乎肯定是一个虚拟地址,因此它仅适用于当前运行的程序(进程)的内存空间.

虚拟地址0x60aa00000800从一个程序和虚拟地址看作0x60aa00000800从另一程序所看到是不同的物理地址.操作系统将虚拟地址映射到物理地址,反之亦然,因此没有冲突.(如果不同的程序可以读取和写入相同的物理内存,那将是一场安全噩梦.)

如果它们每次都不同,也就不足为奇了.例如,某些操作系统随机化堆栈地址以防止某些代码漏洞.我不确定堆地址是否也是随机的,但它们当然可以.

https://en.wikipedia.org/wiki/Virtual_memory