我最近看到一篇文章提到 C/C++ 中的空指针实际上不只是零,而是被编译器解释为平台的空分配地址。
https://stackoverflow.com/a/2760172/2027262
这与我在 Visual Studio 中调试 C++ 时看到的情况有关,其中指针的值为 0xCACACACA(或类似的东西),而它是一个错误的指针(但这可能只是为了我们的利益而显示的值)。
长话短说,一个平台(比如windows)的真实空指针地址是什么?还是我完全误解了答案?
编辑:
此外,(作为扩展)这是做什么的?
int i = 0;
// pretend to do some stuff with i
char* = (char*)i;
编译器会在运行时将指针设置为空还是将其设置为零?如果确实如此,后者是那个 UB?它会破坏程序吗?
最佳答案
Visual Studio 生成的 0xCACACACA
通常用于未初始化的指针,正是出于这个原因。当你看到这个,你就知道出事了。如果将它初始化为 0
,这很可能是预期的行为。这仅在调试节点中完成,通过完全优化,未初始化指针的值将只是垃圾。
是的,NULL
指针没有 0
的值。 0
只是一个文字。实际值可能不同。但是编译器足够聪明,可以将其抽象出来,所以即使你有一个 NULL 指针,其值实际上不是 0(如数字 0),将它与 0
或 NULL 进行比较
仍然会产生 true。最好从 nullptr
的角度来考虑。
关于C++ 什么是 NULL 指针值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16828929/