c++ - 我可以访问地址零吗?

标签 c++ c memory pointers

常量 0 在 C 和 C++ 中用作空指针。但正如问题 "Pointer to a specific fixed address"分配固定地址似乎有一些可能的用途。在任何系统中,对于任何低级任务,访问地址 0 是否有任何可能的需要?

如果有的话,用0作为空指针怎么解决?

如果没有,是什么确定没有这种需要?

最佳答案

无论是在 C 中还是在 C++ 中,空指针值都不会以任何方式与物理地址 0 相关联。您在源代码中使用常量 0 来设置指向空指针值的指针的事实只不过是一 block 语法糖。编译器需要将其转换为在特定平台上用作空指针值的实际物理地址。

换句话说,源代码中的0没有任何物理重要性。例如,它可能是 4213。 IE。语言作者,如果他们很高兴,可以这样做,以便您必须执行 p = 42 才能将指针 p 设置为空指针值.同样,这并不意味着物理地址 42 必须为空指针保留。编译器需要将源代码 p = 42 转换为机器码,以填充实际的物理空指针值(0x00000xBAAD ) 到指针 p 中。这正是现在使用常量 0 的情况。

另外请注意,C 和 C++ 都没有提供严格定义的功能,允许您将特定的物理地址分配给指针。因此,您关于“如何将 0 地址分配给指针”的问题正式没有答案。您根本无法将特定地址分配给 C/C++ 中的指针。但是,在实现定义的特性领域,显式整数到指针的转换旨在产生这种效果。所以,你会这样做

uintptr_t address = 0;
void *p = (void *) address;

注意,这和做的不一样

void *p = 0;

后者总是产生空指针值,而一般情况下前者不会。前者通常会产生一个指向物理地址 0 的指针,它可能是也可能不是给定平台上的空指针值。

关于c++ - 我可以访问地址零吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2761360/

相关文章:

java - 需要有关 C++ 到 Java 翻译的帮助

c - 错误: Bad argument < Array should be CvMat or IplImage>

c - 释放被覆盖的指针

python - 将文件映射到内存

memory - 分配全局内存

mysql - 读写环境中的 MEMORY(HEAP) 与 InnoDB

c++ - boost 图形理解顶点创建行为

C++ WinHttp 获取响应头和正文

c++ - 具有虚拟析构函数的派生类的 Sizeof

c - 从包含时间的文本文件中读取