2015-03-14 2 views
0

Когда я поместил номер в flag[1][2], я автоматически поместил бы тот же номер в flag[2][0].Ошибка при настройке и получении значений из моего двумерного массива

Почему?

#include <iostream> 
using namespace std; 

void inicializarFlag(void); 
void imrpimeflag(void); 

int flag[2][2]; 

int main(){ 

    int i, j, escolha; 

    inicializarFlag(); 
    cout<<"digite as posicoes e o valor: "<<endl; 

    cin>>i; 
    cin>>j; 
    cin>>escolha; 

    flag[i][j] = escolha; 
    imrpimeflag(); 

    return 0; 
} 

void inicializarFlag(void){ 

    for (int i=0; i<=2; i++){ 
     for(int j=0; j<=2; j++){ 
      flag[i][j] = 0; 
     } 
    } 
} 

void imrpimeflag(void){ 

    for (int i=0; i<=2; i++){ 
     for(int j=0; j<=2; j++){ 
      cout<<"["<<i<<"]["<<j<<"]: "<<flag[i][j]<<endl; 
     } 
    } 
} 

ответ

2

При инициализации массива int flag[2][2], вы инициализируете массив 2х2, а не 3х3 массива. Поскольку массивы нулевые индексируются, flag[2][0] помещает int в нулевом столбце третьей строки массива flags 2x2, который выходит за пределы. Поведение размещения элемента вне границ массива не определено и может привести к проблемам, описанным вами.

Объявление int flag[3][3] и код должен работать.

+0

Привет, я внес изменения, которые вы сказали, но когда я поместил значение во флагов [2] [0], он теперь будет помещать то же значение во флаг [1] [3], что ther объявлен int flag [3] [3], вот отпечаток для результата ... http://imageshack.com/a/img633/5035/H7kYfp.jpg –

+0

Правильно - это потому, что если вы объявите 'int flag [3] [3 ] 'тогда есть три строки и три столбца, пронумерованные 0, 1 и 2 для строк и столбцов. В этом случае «флаг [1] [3]» находится за пределами границ, потому что 3 метки не третий, а четвертый столбец 2D-массива (при индексировании массивов начиная с 0). Когда вы объявляете массив с 'int flag [3] [3]', это означает, что вы объявляете массив размером 3x3, но вы не можете использовать номер 3 для доступа к любым элементам массива, потому что 3 знака 4-го столбец при попытке доступа к элементам - и вы не объявили этот 4-й столбец. – cooperl1

+0

Просто для правильности сделанное мной утверждение: «Когда вы объявляете массив с флагом int [3] [3], это означает, что вы объявляете массив размером 3x3», не совсем верно. Но он служит своей цели для размышления об этой проблеме. – cooperl1

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