在rvalue端使用NULL指针解除引用是危险的吗?

时间:2012-08-28 16:45:15

标签: c pointers

我有以下代码。

int *a = NULL;
int b;

b = *a;

它是否以任何方式未定义? 我正在尝试访问仅用于阅读的指向的位置。它能做什么错?

6 个答案:

答案 0 :(得分:5)

  

它是否以任何方式未定义?

是的,行为未定义。

  

我正在尝试访问仅用于阅读的指向的位置。

指向的位置不存在。那里什么都没有。要阅读某些内容,必须要读取一个值,但空指针指向......无处可寻。它没有任何意义。

答案 1 :(得分:3)

实现选择空指针的物理值专门使它们“指向”地址,该地址在给定平台上不包含任何值。这意味着没有什么可看的。此外,在现代虚拟内存平台上,甚至可能没有与该地址相关联的特定“那里”。

如果您是出于纯粹的好奇心,它仍然无法在典型的现代平台上运行:[虚拟]内存区域通常“不属于您”,这意味着硬件/操作系统保护机制将阻止您阅读它(通过崩溃您的程序)。

同时,该语言指出,任何取消引用空指针的尝试都会导致未定义的行为,无论您将其取消引用它。

答案 2 :(得分:2)

是的,这是完全未定义的行为。您正在取消引用空指针。任何事情都可能发生。

答案 3 :(得分:1)

不要取消引用NULL指针。这就像穿越溪流,但更糟。我甚至不确定你想要完成什么?您是否尝试将两个指针初始化为NULL?

答案 4 :(得分:0)

结果未定义,在不同平台下会有所不同。

NULL等于0.因此说int* a = NULL意味着你创建一个指向地址0的指针,它应该包含一个整数。

通过取消引用b = *a,您可以指示程序转到地址0并获取数据。

现在,根据平台,地址0很可能是用户代码无法访问的。如果您没有在操作系统上运行(例如在微控制器环境中运行),则地址0通常是内部ROM的开始。在其他情况下,它可以是堆栈等的开始。

在大多数情况下,当您取消引用空指针时,您将获得空指针异常。

答案 5 :(得分:0)

此处会弹出两个警报。 NULL以及所有其他形式的空指针都被标准严格禁止。并不是因为它们通常在内部通过所有0的位模式实现,以表示这样的指针,但是因为这是指针的单一和单个保留值,表明它没有指向任何地方。不要这样做。

指针指向与整数值0对应的地址是另一回事。你只能通过某种技巧强制执行这样一个值并解释一个点,例如

union over {
  int *a;
  uintptr_t b;
} ov;

ov.b = 0;
int c = *ov.a;

然后发生的事情完全取决于您的平台。如果0是地址空间中的有效地址,则可能有效,但可能不会。除非你知道的更好,否则不要这样做。