gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:14:57 24 4
gpt4 key购买 nike

我打印错了吗?

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com