array subscript is above array bound...
)时, g ++会发出警告-Wall -O2
#include <iostream>
#include <algorithm>
using namespace std;
int a[10];
int n;
int main(){
sort(a, a+n);
return 0;
}
但是这段代码在没有任何警告的情况下编译:
#include <iostream>
#include <algorithm>
using namespace std;
int a[100];
int n;
int main(){
sort(a, a+n);
return 0;
}
为什么会这样?
答案 0 :(得分:1)
当在网上讨论与GCC中-Warray-bounds
相关的问题时,似乎偶尔出现问题,但这些问题通常似乎与非常具体的代码方案有关。该功能似乎依赖于优化器 - 这就是为什么-O2
选项是您查看问题所必需的原因。 (请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35903#c9,其中提及&#34;这需要-O2的原因是-Warray-bounds
要求VRP警告&#34; - VRP是值范围传播)。源中的微小差异很容易导致优化器中的不同行为。
无论如何,我认为-Warray-bounds
对这些问题更重要的是它们似乎也与非常具体的编译器版本联系在一起。例如,这个错误(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43949)报告了4.4.3(据我所知,这个错误可能是导致警告的原因)据报道你工作的是4.2.4,4.5.1和4.6.0,而它在4.5.0中也被破坏了。它的修复显然已进入编译器的4.5.x版本。
无论如何,最重要的是:如果这对你来说真的是一个问题(也就是说,它不仅仅是一种好奇心),你可能需要考虑以下解决方法之一:
-Wno-array-bounds
答案 1 :(得分:-1)
无论哪一个编译都没有警告,两个代码都有一个错误。在你使用的两个代码中都没有启动(也是数组a [10])。
因此,在sort函数中使用“n”之前,您可能希望在其中存储数组“a”的长度。
以下是您的代码的正确版本 -
#include <iostream>
#include <algorithm>
using namespace std;
const int n=10;
int a[n]={3,71,4,5,2,8,5,3,34,87};
int main(){
sort(a,a+n);
for(int i=0;i<n;i++)
cout<<a[i]<<endl;
return 0;
}