2010-03-16 3 views
4

создать 2D динамический массив:Изменить размер 2D динамического массива в C

a = (int**)calloc(n-1, sizeof(int)); 
for(i = 0; i < (n-1); i++) 
    a[i] = (int*)calloc(n, sizeof(int)); 

Тогда мне нужно изменить его размер (добавить новую строку):

a = (int**)realloc(a, n); 
a[n] = (int*)calloc(n, sizeof(int)); 

Но когда я хочу напечатать мой массив,

void Print(void){ 
    int i, j; 
    for(i = 0; i < (n-1); i++){ 
     for(j = 0; j < n; j++){ 
      printf("%d\t", arr[i][j]); 
     } 
     printf("\n"); 
    } 
} 

У меня есть нарушение прав доступа. Первая строка напечатана ... Что мне делать?

+0

OMG - это плохо сломано, прежде чем вы попытаетесь изменить размер - вы принимаете sizeof (int) == sizeof (int *) –

ответ

4
a = (int**)realloc(a, (n + 1) * sizeof(int *)); 
n++; 
+0

oh, thanks .. Размер должен быть в байтах. –

+0

Удивительный исправить чувак. Большое спасибо! –

1

В этом коде:

a = (int**)realloc(a, n); 
a[n] = (int*)calloc(n, sizeof(int)); 

вы обращаетесь (п + 1) -й позиции массива. Вы должны написать:

a = (int**)realloc(a, n * sizeof(int*)); 
a[n-1] = (int*)calloc(n, sizeof(int)); 
4

Выделяя массив:

int **a; 
ing **tmp; 
size_t i; 

a = calloc(n-1, sizeof *a); // type of a==int **, type of *a==int * 
if (a) 
{ 
    for (i = 0; i < n-1; i++) 
    { 
    a[i] = calloc(n, sizeof *a[i]); // type of a[i]==int *, type of *a[i]==int 
    } 
} 

Изменение размера массива:

/** 
* Assign result of realloc to a temporary variable; if realloc fails it will 
* return NULL, which would cause us to lose our pointer in the event of 
* a failure. 
*/ 
tmp = realloc(a, sizeof *a * n); 
if (!tmp) 
{ 
    // realloc failed; handle error or exit 
} 
else 
{ 
    a = tmp; 
    a[n-1] = calloc(n, sizeof *a[n-1]); 
} 

Вещи, чтобы отметить:

  1. Начиная с C89, вам не нужно выводить результат malloc(), calloc() или realloc(), и это может подавить потенциально полезное предупреждение; если ничего другого, это упрощает чтение кода.
  2. Используйте оператор sizeof для объекта, а не тип; он немного расшифровывает код, и вам не нужно возвращаться и обновлять все вызовы malloc/calloc/realloc, если вы измените тип a.
  3. Если у вас есть n элементов в массиве, индекс последнего элемента будет n-1.
+1

+1 для единственного правильного ответа (упоминание о том, что 'a = realloc (a, ...);' неверно). –