我有以下代码。
int *a = NULL;
int b;
b = *a;
它是否以任何方式未定义? 我正在尝试访问仅用于阅读的指向的位置。它能做什么错?
答案 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
是地址空间中的有效地址,则可能有效,但可能不会。除非你知道的更好,否则不要这样做。