2015-04-20 3 views
-1

Я объявляю двумерный массив a (m * n) в цикле for. Когда цикл for запускается в первый раз, нет проблем, но во второй раз он генерирует ошибку. Программа:Неправильная контрольная сумма при использовании calloc и свободная в цикле

for (int j=0; j<2; j++) { 
    int **a = (int**)calloc(n,sizeof(int*)); 
    for (int i=0; i<n; i++) { 
     a[i] = (int*)calloc(m,sizeof(int)); 
    } 
    //...some operation to a[m,n] array 
    for (int i=0; i<n; i++) 
     free(a[i]); 
    free(a); 
} 

Когда цикл for проходит во второй раз, он бежит к линии, содержащей calloc и генерирует следующее сообщение об ошибке на консоли:

таНоса: *** погрешность объект 0x94a8b14: неправильная контрольная сумма освобожденного объекта - объект, вероятно, был изменен после освобождения

Это не имеет никакого значения, если я удалить строки, содержащие free.

+3

'a' имеет емкость для указателей' n', но вы его обрабатываете так, как будто у него 'm'. – juanchopanza

+0

Я редактирую сообщение, m теперь n. – hzhou

+0

вы должны отметить это C, а не C++ кстати – hauron

ответ

5
int **a=(int**)calloc(n,sizeof(int*)); 
        ^
for(int i=0;i<m;i++){ 
      ^
    a[i]=(int*)calloc(m,sizeof(int)); 
    ^

Это катастрофически катастрофически, если n < m.

2

Линия:

int **a=(int**)calloc(n,sizeof(int*)); 

создает массив указателей 'N' для целого числа массивов. Это ваше измерение «n».

Ваш следующий шаг должен состоять в том, чтобы перебирать каждый элемент массива (размерности «n») и создавать массив размером «m». Это даст вам измерение «m».

Ваш внутренний цикл:

for (int i=0; i<m; i++) { 

фактически перебирает элементы 'M' вашего массива размером 'N'. Это неверно. Если вы смените эту строку на:

for (int i=0; i<n; i++) { 

Вам следует избегать ошибок выделения памяти. Не забудьте также изменить 'm' на 'n' во второй внутренний цикл (чтобы освободить правильный объем памяти).

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