Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;排序功能警告_C++_Sorting_Stl_G++ - Fatal编程技术网

C++ g++;排序功能警告

C++ g++;排序功能警告,c++,sorting,stl,g++,C++,Sorting,Stl,G++,当我编译以下代码(-Wall-O2)时,g++发出警告数组下标在数组绑定之上…) #包括 #包括 使用名称空间std; INTA[10]; int n; int main(){ 排序(a,a+n); 返回0; } 但此代码编译时没有任何警告: #include <iostream> #include <algorithm> using namespace std; int a[100]; int n; int main(){ sort(a, a+n);

当我编译以下代码(
-Wall-O2
)时,g++发出警告
数组下标在数组绑定之上…

#包括
#包括
使用名称空间std;
INTA[10];
int n;
int main(){
排序(a,a+n);
返回0;
}
但此代码编译时没有任何警告:

#include <iostream>
#include <algorithm>
using namespace std;
int a[100];
int n;
int main(){
    sort(a, a+n);

    return 0;
} 
#包括
#包括
使用名称空间std;
INTA[100];
int n;
int main(){
排序(a,a+n);
返回0;
} 

为什么会发生这种情况?

无论编译哪一个代码时没有警告,这两个代码中都存在错误。在这两个代码中,您使用的都是未初始化的n(也是数组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;
}
#包括
#包括
使用名称空间std;
常数int n=10;
int a[n]={3,71,4,5,2,8,5,3,34,87};
int main(){
排序(a,a+n);

对于(int i=0;i当在网络上搜索与GCC中的
-Warray bounds
相关的问题时,似乎偶尔会出现问题,但这些问题通常似乎与非常特定的代码场景有关。该功能似乎依赖于优化器-这就是为什么您需要
-O2
选项来查看pro错误。(请参阅其中提到的“这需要-O2的原因是
-Warray bounds
需要VRP发出警告”-VRP是值范围传播)。源中的微小差异很容易导致优化器中的不同行为

无论如何,我认为关于
-Warray边界的这些问题更重要的是,它们似乎也与非常特定的编译器版本有关(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版本

不管怎样,底线:如果这对你来说确实是一个问题(即,它不仅仅是一个好奇心),你可能会想一个以下的解决方案:
  • 转到4.5.1或更高版本的GCC
  • 通过代码更改解决问题。如前所述,小的更改可能会阻止触发警告
  • 使用
    -Wno数组边界关闭警告

@Mat:
0
当然。全局原语总是初始化为零。它是0。它是由BSS初始化的。两者都使用g++4.7.0在没有警告的情况下编译!哪个GCC版本会向您发出警告?除了-Wall之外,还有其他编译器标志吗,比如-O3?在g++4.4到g++4.7中尝试过,没有一个版本会使用
-Wall
数组的值和
n
被初始化为
0
#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;
}