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