【发布时间】:2015-01-26 13:33:44
【问题描述】:
为什么以下代码在i 到达14 之前有效(printf() 被执行)?实际上,当i 超过数组的第 10 个元素时,执行应该会失败,不是吗?即使我写:
for(i=0; i<100; i++)
当然,我仍然遇到分段错误,但所有值都被打印出来了。
#include <stdio.h>
void funcX() {
int i;
int array[10];
printf("\tEntering funcX()\n");
//for(i=0; i<11; i++) { //This works
//for(i=0; i<12; i++) { //This works
//for(i=0; i<13; i++) { //This works
for(i=0; i<14; i++) { //***This fails****
array[i]=i;
printf( "array[i]= %d\n", array[i] );
}
printf("\tLeaving funcX()\n");
}
int main(int argc, char** argv) {
printf("Calling funcX() from main()\n");
funcX();
printf("Returning from funcX()\n");
return(0);
}
在 RH Linux 上使用 gcc -m32 编译。
【问题讨论】:
-
你为什么要这样做?
-
它恰好起作用。写入未分配的内存是未定义的行为。最终,你遇到了一个问题,它崩溃了。您不能依赖它在分配的内存之外工作;这只是基于您机器当前状态的侥幸。
-
非常类似于Is accessing a global array outside its bound undefined behavior? ...您的答案就在那里,区别在于全局数组与自动数组,但其他方面基本相同。
-
不禁止越界写,但会导致undefined behavior。
-
您处于未定义的行为领域!!请快速离开该区域!我重复“未定义的行为”! - 好的,严肃地说,这是未定义的行为,它可能会或可能不会起作用。阅读此stackoverflow.com/questions/2397984/…。也许您应该尝试使用 -Wall 开关进行编译