在C和C ++中,空指针取消引用是未定义的行为。 Objective-C怎么样?
换句话说,这个代码保证做什么?
*(long*)0 = 0;
背景:我想知道this answer是否可能触发未定义的行为,可能导致随机的事情,比如语句被优化,甚至更奇怪。
当然,我不认可这样做。不过,了解语言规则很重要。
答案 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”),因为该答案总是崩溃,我不知道它是如何工作的 - 或者被编译器优化掉了。