为什么不崩溃?

时间:2013-03-15 11:08:57

标签: objective-c xcode

所以,我有这段代码:

int randomNumber;
int max = 16;
int swap;
int table[16];

srand(time(NULL));
for (int i = 0; i < 16; ++i)
    table[i] = i + 1;

for (int i = 0; i < 16; ++i) {
    randomNumber = rand() % max;
    swap = table[max];
    table[max] = tablica_losowa[losuj];
    table[losuj] = swap;
    --max;
}

显然,问题应该在max == 16时首先通过第二个for循环,我尝试访问表[max],但它编译并运行正常。

这是来自iPad(最新的软件)应用程序,用Objective-C,XCode 4.6,Apple LLVM Compiler 4.2编写。

任何提示?

2 个答案:

答案 0 :(得分:3)

访问其他东西所拥有的内存位置并不能保证崩溃,它只能保证你做的事情不应该。将要发生的事情取决于内存位置及其使用方式。

编译器根本没有做任何导致问题的事情。 Objective C基于C ...它在某些方面稍微紧缩,但只要语法正确,C就会让你尝试做很多事情,无论多么无效。在您的情况下,写入表[16] 可以写入不重要的内存位置。它可能写入swap,然后被覆盖。检查装配是否确定。

答案 1 :(得分:0)

问题是C(和Objective-C)没有对“未定义的行为”给出任何保证。超出边界访问table[16]的数组是这种未定义的行为(参见C11标准6.5.6)。

对于未定义的行为,这种“不给予保证”的情况非常广泛。然后你的程序可以自由地做任何事情。它可以从网络摄像头拍摄照片并将其发布在Facebook上,向您的老板发送攻击性电子邮件,然后开始格式化您的硬盘。虽然不太可能,但就语言所说的内容而言,这种行为完全有效。

因此,忽略错误并继续执行程序显然也很好。