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