Изменить размер 2D динамического массива в C - PullRequest
4 голосов
/ 16 марта 2010

Я создаю двумерный динамический массив:

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");
    }
}

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

Ответы [ 3 ]

4 голосов
/ 16 марта 2010
a = (int**)realloc(a, (n + 1) * sizeof(int *));
n++;
4 голосов
/ 17 марта 2010

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

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 голос
/ 16 марта 2010

В этом коде:

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

вы получаете доступ к (n + 1) -й позиции массива. Вы должны написать:

a = (int**)realloc(a, n * sizeof(int*));
a[n-1] = (int*)calloc(n, sizeof(int));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...