例如,我们有
int* p;
这个指针可以随机初始化0,它意味着由操作系统初始化,在这种情况下我们不改变这个指针的值吗?
答案 0 :(得分:2)
这是一个棘手的部分:没有有效的程序可以解决这个问题。阅读p
是未定义的行为,即使nullptr
实际上不包含p
(!),也可能发生包括返回nullptr
的任何内容p>
如果您想知道如何做到这一点,p
可能会在第一次写入时被放入寄存器中。在此之前尝试阅读p
会产生相当随机的结果。
答案 1 :(得分:0)
假设:你在谈论在某个时刻,malloc或new的返回应该是0的可能性。
在这种情况下,我相信答案是否定的。指针将采用虚拟地址。作为动态分配的东西,它将获得属于堆的地址,该地址永远不会从地址0开始。
进程的虚拟内存空间分为更多部分:Text,Data,BSS,Heap(所有动态分配的对象都去了),堆栈和内核空间。下图是针对32b操作系统,但对于64b,图片类似。
您可以创建一个小程序并阅读不同空间中的某些地址,并了解您可以访问和不能访问的内容。
堆(指针指向的位置)在Text,Data和BSS段之后增长。 所以永远不会是0 。
答案 2 :(得分:-1)
将变量声明为全局或静态将由OS自动初始化为0X0。