Objective-C中的空指针取消引用是否为未定义的行为?
在C和C ++中,空指针取消引用是未定义的行为。 Objective-C怎么样?
换句话说,这个代码保证做什么?
*(long*)0 = 0;
背景:我想知道这个答案是否可能触发未定义的行为,可能导致随机的事情,如声明被优化或甚至更奇怪的东西。
当然,我不认可这样做。 但是,了解语言规则也很重要。
由于Objective-C只不过是在C之上的面向对象层,纯C语句没有特殊的附加含义。 据此,在这种情况下, *(long*)0 = 0;
就像在C中一样被评估和解释(因为它是 C),因此它调用未定义的行为。 因此,不保证做任何事情。
取消引用空指针在Objective-C中仍未定义。
唯一需要注意的是,消息传递不需要取消引用。 传递给空指针(或Objective-C术语中的nil
)始终是显式安全的,并定义为返回另一个空指针。
因此,复合消息传递(如[[class alloc] init]
)始终是显式安全的。
该语句唯一保证的是调用未定义的行为。
可以保证使用特定编译器在特定平台上执行特定操作。
一个strcpy(0,“bla”),如该答案中所见,总是崩溃,我不知道它是如何工作的 – 或者被编译器优化掉。