2016-03-31 8 views
0

Я новичок в программировании, и я пытаюсь понять двумерный массив. Я написал этот код, чтобы просто проверить свой код, чтобы убедиться, что он работает или нет. к сожалению, я получаю ошибку сегментации. Я знаю, это означает, что что-то, что я написал, нечитаемо для компилятора, но я не знаю, что это такое. потому что все кажется мне прекрасным.Ошибка сегментации двухмерного массива

#include<iostream> 


using namespace std; 


int main(){ 

    int col, row,i; 
    int **array; 

    cout << "How many rows?\n"; 
    cin >> row; 
    cout << "How many colomns\n"; 
    cin >> col; 

cout << "!!!!!!!!!!!!"; 

    array = new int*[row]; 
    for (int i = 0;i<row;i++){ 
      array[i] = new int[col]; 
    } 

     cout << "!!!!!!!!!!!!"; 

    for(i=0; i<row; i++){ 
     int x=1; 
     array[0][i]= x;; 
    x++; 
    } 
     cout << "!!!!!!!!!!!!"; 
    cout << array[row][col]; 

    for(i=0; i<row; i++){ 

    delete [] array[i]; 
    delete [] array; 
    } 
    return 0; 
} 

ошибка является: " Сколько строк Сколько colomns вина Сегментация (ядро сбрасывали) ?"

+0

'соиЬ << массив [строка] [Col];' вне диапазона. 'array [row-1] [col-1]' настолько глубок, насколько вы можете идти. – WhozCraig

+0

x ++; ничего не делает; x выходит за пределы области действия в конце каждой итерации цикла и воссоздается в начале следующей итерации. – mjwach

+0

В наши дни мы не используем указатели и массивы, а также новые и низкоуровневые на C++. Есть более здоровые альтернативы, такие как std :: vector и std :: shared_ptr. –

ответ

1

array[0][i]= x; выглядит неправильно. Это должно быть:

array[i][0]= x; 

Первый указатель для строки и второй для col.

Позже cout << array[row][col]; также отжимается как row вне допустимого диапазона.

Как вы удалить массив тоже неправильно, он должен быть:

for(i=row - 1; i >= 0; --i){ 
    delete [] array[i]; 
} 
delete [] array; 
+0

так должно быть так? – pnewbie

0
cout << array[row][col]; 

Вне диапазона в каждом из двух измерений, как уже говорил другие.

for(i=0; i<row; i++){ 

delete [] array[i]; 
delete [] array; 
} 

Вы удаляете элементы массива три раза, один раз для каждого элемента. Это хорошо. Вы также удаляете массив три раза. Это опасно и неправильно.

0

так должно быть так?

#include<iostream> 


using namespace std; 


int main(){ 

    int col, row,i; 
    int **array; 

    cout << "How many rows?\n"; 
    cin >> row; 
    cout << "How many colomns\n"; 
    cin >> col; 

    array = new int*[row]; 
    for (int i = 0;i<row;i++){ 
      array[i] = new int[col]; 
    } 

     cout << "!!!!!!!!!!!!"; 

    for(i=0; i<row; i++){ 
     int x=1; 
     array[i][0]= x;; 
    x++; 
    } 
     cout << "!!!!!!!!!!!!"; 
    for(i=0; i<row; i++){ 
     for(int j=0; j<col; j++){ 
      array[i][j]; 
     } 
    } 
    cout << array[row][col];  

    for(i=0; i<row; i++){ 

    delete [] array[i]; 
    delete [] array; 
    } 
    return 0; 
} 
+0

x ++; и массив [i] [j]; ничего не делайте, но они ничего не повредят. delete [] array; по-прежнему выполняется неправильно три раза (при условии, что строка равна 3). В противном случае я не вижу проблем, хотя я не подтвердил это, запустив код. – mjwach

0

Эта линия выходит за пределы диапазона cout << array[row][col]; Если вы хотите напечатать последний элемент затем изменить эту строку cout << array[row-1][col-1];

Как другие упомянули ниже является код для удаления выделенной памяти

for(i=0; i <row; i++){ 
    delete [] array[i];  
} 
delete [] array; 

Также в вашем коде ниже x всегда будет 1, x++ не действует.

for(i=0; i<row; i++){ 
int x=1;  
array[0][i]= x; 
x++; 
} 

если вы хотите увеличить x для каждой строки затем инициализировать x вне цикла как этот

int x=1; 
for(i=0; i<row; i++){  
    array[0][i]= x;; 
    x++; 
} 
Смежные вопросы