Objective-C中的空指针是否取消引用未定义的行为?

时间:2012-11-30 19:16:00

标签: objective-c c undefined-behavior

在C和C ++中,空指针取消引用是未定义的行为。 Objective-C怎么样?

换句话说,这个代码保证做什么?

*(long*)0 = 0;

背景:我想知道this answer是否可能触发未定义的行为,可能导致随机的事情,比如语句被优化,甚至更奇怪。

当然,我不认可这样做。不过,了解语言规则很重要。

4 个答案:

答案 0 :(得分:7)

由于Objective-C只不过是C之上的面向对象层,纯C语句没有特殊的附加含义。根据这一点,在这种情况下,*(long*)0 = 0;被评估和解释就像在C中一样(因为它 C),因此它调用未定义的行为。因此,我们无法保证做任何事情。

答案 1 :(得分:2)

取消引用空指针在Objective-C中仍未定义。

唯一需要注意的是,消息传递不需要取消引用。传递给空指针(或Objective-C术语中的nil)始终是显式安全的,并定义为返回另一个空指针。

因此,复合消息传递(如[[class alloc] init])始终是明确安全的。

答案 2 :(得分:1)

保证要做的唯一声明就是调用未定义的行为。

可以保证在特定平台上使用特定编译器执行特定操作。

答案 3 :(得分:0)

一个strcpy(0,“bla”),因为该答案总是崩溃,我不知道它是如何工作的 - 或者被编译器优化掉了。