"0x2"是C++中的空指针吗



在以下代码中:

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

此代码导致分段故障。但是:

int* p = (int*)0x2;
cout << (p == nullptr);

输出为0。因此:

  1. 指向地址0x2的指针真的是空指针吗(这会导致分段故障(
  2. 如何通过if语句处理像0x2这样的情况?(我的意思是,处理取消引用会导致Segmentation Fault的情况。因为正如您在if (p == nullptr)中看到的,这种情况没有得到处理(
  3. 除了0x2之外,还有哪些地址会取消引用指向它们的指针,从而导致分段故障?为什么

唯一可转换为std::nullptr的整数值为0。

0x2是否是有效的内存地址取决于您的程序。如果您只是将这个内存位置别名为int*,那么这是未定义的行为,您很幸运会出现分段错误。

"处理"0x2这样的情况的方法是以某种方式构建程序,以确保0x2是有效的内存地址。仅凭地址往往是不够的。很难保证在大型代码库中没有悬挂指针,但通过智能地使用智能指针和引用,我们可以设计出一个非常安全的程序。通常情况下,你可以忽略价值。

除了0x2之外,还有哪些地址会取消引用指向它们的指针,从而导致分段故障,为什么?

所有这些。这取决于你的程序(以及你的操作系统(。你不能只是把随机内存位置解释为整数,然后使用它们。除其他外,这肯定会违反严格的混叠规则

您可以在null以外的其他地址上获得分段错误。这只是意味着你试图访问操作系统从你的程序中保留的内存。例如,早期地址可能用于引导进程等。

另请参阅什么是分段错误?

指向地址0x2的指针真的是空指针吗(这会导致分段故障(?

不,它不是输出0所证明的空指针。

如何通过if语句处理0x2这样的情况?(我的意思是,处理取消引用会导致分段错误的情况。因为正如你在if(p==nullptr(中看到的,这种情况没有得到处理(。

你不能。没有允许您的程序使用的所有地址的列表。

除了0x2之外,还有哪些地址会取消引用指向它们的指针,从而导致分段故障,为什么?

操作系统未分配给程序的所有地址。此外,写入属于程序的一些地址会导致未定义的行为,如崩溃。

要么你知道硬件之类的特殊地址,要么你分配内存并获得相应的地址。

指向地址0x2的指针真的是空指针吗

0x2不是空指针常量。

但是,null的未指定。理论上可能是2。但在大多数系统上,它是0。您显示的输出表明,null在您的系统中没有值2。

(哪一个会导致分段故障(?

通过null分隔并不是导致segfault的唯一原因。

如何通过if语句处理0x2这样的情况?(我的意思是,处理取消引用会导致分段故障的情况。

您通过从不尝试间接通过无效指针来"处理"它们。没有办法根据指针的值来知道它是否有效(除了,我们知道null从来都不是有效的(。

除了0x2之外,还有哪些地址会取消引用指向它们的指针,从而导致分段故障,为什么?

从C++的角度来看:在对象的生存期之外访问任何对象都会导致程序的行为未定义。如果在地址X处没有对象,那么访问*X是未定义的行为,除非另有规定。对象是通过定义变量和使用new表达式来创建的。

从操作系统的角度来看,这些事情会导致segfault:所有地址,这些地址没有映射到任何内存。所有写入到只读存储器。

相关内容

  • 没有找到相关文章

最新更新