2012-04-17 4 views
4

г ++ дает предупреждение array subscript is above array bound..., когда я скомпилировать следующий код (-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; 
} 

Почему это происходит?

+1

Что значение п? – Matt

+7

@Mat: '0' конечно. Глобальные примитивы всегда инициализируются нулем. – orlp

+0

@ nightcracker не похож 0 –

ответ

1

Когда ковыряться в сети по вопросам, связанным с -Warray-bounds в GCC, кажется, что проблемы с этим возникают, но иногда эти проблемы, как правило, кажется, привязан к очень специфическим сценариям кода. Функция, похоже, полагается на оптимизатор - вот почему вам нужна опция -O2. (см. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35903#c9, где упоминается, что «причина, по которой это требует -O2, заключается в том, что -Warray-bounds требует, чтобы VRP предупреждал» - 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 компилятора.

Во всяком случае, в нижней строке: если это действительно проблемы для вас (т. Е, это не просто любопытство), вы можете рассмотреть один из следующих решений/исправления:

  • двигаться к версия GCC, которая составляет 4.5.1 или лучше
  • Работает над проблемой с изменением кода. Как упоминалось выше, небольшие изменения могут предотвратить предупреждение от того срабатывает
  • отключения предупреждения с -Wno-array-bounds
-1

Независимо от того, какой из них был скомпилирован без предупреждений, в обоих кодах есть ошибка. В обоих кодах вы используете n непосвященных (также массив a [10]).

Итак, перед использованием функции «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; 
} 
+2

Значения массива и 'n' инициализируются значением' 0'. –

+0

Да, вы правы, так или иначе пропустили это. – shade

Смежные вопросы