在下面的代码中:
int* p = (int*)0x2;
*p = 1;
此代码导致分段错误。但:
int* p = (int*)0x2;
cout << (p == nullptr);
输出为
0
。所以:0x2
的指针是否真的为空指针(这会导致分段错误)? 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/