1

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

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

*(long*)0 = 0;

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

当然,我不赞成这样做。尽管如此,了解语言规则还是很重要的。

4

4 回答 4

7

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

于 2012-11-30T19:19:31.733 回答
2

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

唯一需要注意的是消息传递不需要取消引用。向空指针(或nilObjective-C 术语)发送消息总是明确安全的,并定义为返回进一步的空指针。

因此,像 一样的复合消息传递[[class alloc] init]始终是明确安全的。

于 2012-11-30T19:20:57.180 回答
1

该语句唯一能保证做的就是调用未定义的行为。

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

于 2012-11-30T19:18:52.960 回答
0

在那个答案中看到的 strcpy(0, "bla") 总是崩溃,我看不出它是如何工作的——或者被编译器优化掉。

于 2012-11-30T20:48:42.623 回答