c - 打印 malloc 的指针总是给出相同的地址

标签 c pointers malloc printf

我打印错了吗?

#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 是不同的物理 地址。操作系统将虚拟地址映射到物理地址,反之亦然,因此不存在冲突。 (如果不同的程序可以读写相同的物理内存,那将是一场安全噩梦。)

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

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

关于c - 打印 malloc 的指针总是给出相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864399/

相关文章:

c++ - 无法将参数 3 从 'const QGraphicsItem *' 转换为 'const QObject *' ,即 this 指针,对象是 QGraphicsObject 的子类

C编程: Freeing nested multidimensional arrays inside structs

c - UNIX shell 段错误

c - BPF_PROG_RUN 是否实现了后备 ebpf 解释器?

c++ - 为什么允许我为包含常量指针的 vector 分配新地址?

c - 断言在某个点失败

c - 在 GCC 中对齐 malloc()?

c - c 中的字符串和数组到底是什么以及 strlen() 的用途是什么

c - 苹果 vDSP 示例的问题

使用指针的代码不起作用