所以,我有这段代码:
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编写。
任何提示?
答案 0 :(得分:3)
访问其他东西所拥有的内存位置并不能保证崩溃,它只能保证你做的事情不应该。将要发生的事情取决于内存位置及其使用方式。
编译器根本没有做任何导致问题的事情。 Objective C基于C ...它在某些方面稍微紧缩,但只要语法正确,C就会让你尝试做很多事情,无论多么无效。在您的情况下,写入表[16] 可以写入不重要的内存位置。它可能写入swap
,然后被覆盖。检查装配是否确定。
答案 1 :(得分:0)
问题是C(和Objective-C)没有对“未定义的行为”给出任何保证。超出边界访问table[16]
的数组是这种未定义的行为(参见C11标准6.5.6)。
对于未定义的行为,这种“不给予保证”的情况非常广泛。然后你的程序可以自由地做任何事情。它可以从网络摄像头拍摄照片并将其发布在Facebook上,向您的老板发送攻击性电子邮件,然后开始格式化您的硬盘。虽然不太可能,但就语言所说的内容而言,这种行为完全有效。
因此,忽略错误并继续执行程序显然也很好。