指针是否可以由等于0的随机地址初始化?

时间:2015-02-24 06:20:10

标签: c++ memory-management null operating-system address-space

例如,我们有

int* p;

这个指针可以随机初始化0,它意味着由操作系统初始化,在这种情况下我们不改变这个指针的值吗?

3 个答案:

答案 0 :(得分:2)

这是一个棘手的部分:没有有效的程序可以解决这个问题。阅读p是未定义的行为,即使nullptr实际上不包含p(!),也可能发生包括返回nullptr的任何内容p>

如果您想知道如何做到这一点,p可能会在第一次写入时被放入寄存器中。在此之前尝试阅读p会产生相当随机的结果。

答案 1 :(得分:0)

假设:你在谈论在某个时刻,malloc或new的返回应该是0的可能性。

在这种情况下,我相信答案是否定的。指针将采用虚拟地址。作为动态分配的东西,它将获得属于的地址,该地址永远不会从地址0开始。

进程的虚拟内存空间分为更多部分:Text,Data,BSS,Heap(所有动态分配的对象都去了),堆栈和内核空间。下图是针对32b操作系统,但对于64b,图片类似。

您可以创建一个小程序并阅读不同空间中的某些地址,并了解您可以访问和不能访问的内容。

enter image description here

堆(指针指向的位置)在Text,Data和BSS段之后增长。 所以永远不会是0

答案 2 :(得分:-1)

将变量声明为全局或静态将由OS自动初始化为0X0。