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

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

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

有什么提示吗?

4

2 回答 2

3

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

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

于 2013-03-15T11:11:27.353 回答
0

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

在未定义行为的情况下,这种“不保证”走得很远。然后你的程序可以自由地做任何事情。它可以从网络摄像头拍摄一张照片并将其发布到 Facebook 上,向您的老板发送一封令人反感的电子邮件,然后开始格式化您的硬盘驱动器。虽然不太可能,但就语言所说的而言,这种行为是完全有效的。

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

于 2013-03-15T11:33:52.253 回答