在下面的代码中:

int* p = (int*)0x2;
*p = 1;

此代码导致分段错误。但:
int* p = (int*)0x2;
cout << (p == nullptr);

输出为0。所以:
  • 指向地址0x2的指针是否真的为空指针(这会导致分段错误)?
  • 如何通过if语句处理类似0x2的情况? (我的意思是,处理解除引用会导致分段错误的情况。因为正如在if (p == nullptr)中看到的那样,这种情况未得到处理)。
  • 除了0x2之外,还有哪些地址解引用指向它们的指针会导致分段错误,为什么?
  • 最佳答案

    可转换为std::nullptr的唯一整数值​​为0。
    0x2是否为有效的内存地址取决于您的程序。如果您只是将该存储位置别名为int*,这是未定义的行为,那么您很幸运遇到分段错误。

    您处理“0x2”之类的情况的方式是以某种方式构造程序,以确保0x2是有效的内存地址。仅地址本身是不够的。很难保证在大型代码库中没有悬挂的指针,但是通过智能地使用智能指针和引用,我们可以设计一个相当安全的程序。通常,您可以摆脱值(value)传递。



    他们全部。这取决于您的程序(以及您的操作系统)。您不能只是将随机存储位置解释为整数然后使用它们。除其他外,这肯定会违反strict aliasing rule

    关于c++ - `0x2`在C++中是否为空指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61119907/

    10-13 08:13