2015-09-09 109 views
-2

在下面的代码的,我已经分配的值到一个数组元件,其出数组界限,在Linux的环境CLI代码给我错误消息:array index 5 is past the end of the array which contains 5 elements阵列:出索引/边界

但在IDE上调试时 codeblocks -compiler找不到这个bug-那么有什么解释吗?

#include <stdio.h> 
int main() 
{ 
    int array[5],i; 
    for (i=0; i<5; i++) { 
     array[i] = i+1; 
    } 
    array[5] = 666; 

    for (i=0; i<5; i++) { 
     printf("array[%d]=%d\n", i, array[i]); 
    } 
    printf("array[5]=%d\n", array[5]); 
    return 0; 
} 
+6

在数组边界之外使用指示符是[未定义的行为](https://www.google.pl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=c%20undefined%20behavior )。除了任何IDE都不能做任何事情。 – Crozin

+0

codeblocs的编译器是什么? – LPs

+0

想想** undefined ** _behaviour_的含义。 – Olaf

回答

0

与大多数IDE一样,代码块不包含编译器,不会自己产生这样的警告。相反,它会调用像gcc这样的命令行编译器,并向您显示编译器返回的错误和警告。

您应该在Codeblocks /项目设置中检查使用哪些编译器选项调用哪个编译器。

GCC应该产生一个“数组下标是以上数组界限”警告为您的代码,而是仅与-Wall-O2和选项(或等同物)。

优化(-O2)通常未启用调试功能,这可能会解释为什么在调试时没有得到警告

0

当您访问数组索引时,C和C++不会执行绑定检查。您阅读时得到的数值就是堆栈在这个特定位置存在的结果。他们完全没有定义。

两个编译器之间的差异可能是由于其中一个是包含某些数组绑定检查的更新版本。