2013-03-15 78 views
0

所以,我有这样的代码:为什么没有这个崩溃?

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; 
} 

显然,这个问题应该是第一次通过第二个for循环时最大== 16,我尝试访问表[MAX],但它编译运行良好。

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

任何提示?

回答

3

访问其他东西所拥有的内存位置并不能保证崩溃,它只能保证你正在做某件你不应该做的事情。将发生什么取决于内存位置以及如何使用。

编译器根本没有做任何事情在这里引起问题。 Objective C基于C ...在某些方面它有点紧,但只要语法正确,C会让你尝试做很多事情,不管它多么无效。在你的情况下,写入表[16] 可能正在写入一个不重要的内存位置。它可能会写入swap,然后被覆盖。检查组件以确定。

+0

是的,你是对的,我意识到这一点,但当我访问数组超出范围时,我习惯了代码崩溃。你知道这个行为是否特定于Objective-C,iPad(内存管理?)还是编译器?坦率地说,我正在寻找一个更深入的答案,如果有可能:) – Losiowaty 2013-03-15 11:16:20

+0

我认为OP是来自Java或类似的背景,其中outOfBound异常生成并崩溃。 – 2013-03-15 11:16:29

+1

Losiowaty编译器根本没有做任何事情来解决这里的问题。我认为@AnoopVaidya是正确的,你的经验可能是在这种情况下,环境迫使崩溃的语言? Objective C基于C ...在某些方面它有点紧,但只要语法正确,C是一种语言,无论它有多么无效,都可以让你做很多事情。在你的情况下,写入表[16]可能会写入一个不重要的内存位置。它可能会写入_swap_,然后被覆盖。检查组件以确定。 – mah 2013-03-15 11:20:48

0

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

在未定义行为的情况下,这种“不给予保证”的情况非常糟糕。你的程序然后可以自由地做任何事情。它可以从网络摄像头拍摄照片并在Facebook上发布,向您的老板发送冒犯性电子邮件,然后开始格式化您的硬盘。虽然不太可能,但这种行为在语言表达方面完全有效。

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