2013-09-01 2 views
0

У меня есть домашнее задание, где мне приходится динамически выделять 2d-массив, и я получаю seg-ошибки, когда мои массивы длинны и тощие, например 2x8, и проблема возникает только тогда, когда определенные значения в массиве. вот мой код для создания массива, а затем его удаление.Seg fault динамически распределенный массив 2d

int main() 
{ 
    int **p; 
    int w, h; 

    cin >> w >> h; 

    p= new int *[w]; 
    for (int k=0; k<w; k++) 
    p[k]= new int[h]; 
    for (int i=0; i<h; i++) 
    { 
    for(int k=0; k<w; k++) 
    { 
     cin >> p[i][k]; 
    } 
    } 


    for (int k=0; k < w; k++) 
    delete []p[k]; 
    delete []p; 
    return 0; 
} 

example input that causes seg fault: 
8 2 
5 4 2 3 0 1 2 5 
2 0 1 0 9 6 3 2 

Использование gdb Я нашел, что это segfaulting сразу после первого удаления в цикле.

ответ

0

Вы перепутали свои индексы. Вы выделяете указатели w, но ваша петля работает i через h элементов.

0

Петли для назначения значений имеют свои границы, замененные.

p дается массив длиной w, но тогда итератор i, который петля до h используется для индексирования его.

p= new int *[w]; 

.... 

cin >> p[i][k]; 

p[i][k] читается как p[i] затем индексируется [k].