Динамически размещенный массив в структуре, неожиданно измененной в C

Недавно я столкнулся с концепцией динамически распределенных массивов, и при ее применении я столкнулся со следующей проблемой.

В структуре я определил несколько указателей, которые будут выделены позже:

typedef struct CELL {
 int total;
 int* number;
 char** type;
}CELL;

В функции эта структура имеет свою память, выделенную функцией malloc(), затем двум указателям выделяются 1D и 2D массивы с помощью следующих методов:

int iallocate1D(int** arr, int m){
 if ( (*arr = malloc(m*sizeof*arr))==NULL ) return 1;
 return 0;
}

а также

int callocate2D(char*** arr, int m, int n){
 int i;
 *arr = malloc(m*sizeof*arr);
 if (*arr==NULL) return 1;
 for(i=0;i<m;i++){
  (*arr)[i] = malloc(n*sizeof(*arr)[i]);
  if ((*arr)[i]==NULL) return 2;
 }
 return 0;
}

В функции, которая принимает CELL* в качестве аргумента, я инициализировал все массивы:

int loadCell(CELL** cell){
 *cell = malloc(sizeof*cell);
 iallocate1D(&(*cell)->number, 2);          // 1D array of length 2
 callocate2D(&(*cell)->type, 2, 3);         // 2D array of size 2*3
}

До сих пор все в порядке, и я просмотрел некоторые значения, чтобы заполнить каждый элемент двух массивов. Я проверил с printf, они казались в порядке. И тут возникла проблема, когда я изменил значение

(*cell)->total = 1;

что я думал, не имеет значения, массив двумерных символов также был изменен. До этой модификации char[1][0] == 'L', но после этого char[1][0] == '\3'. Я напечатал каждый элемент и обнаружил, что только этот элемент был изменен. Достаточно утомленный, но я не мог понять, где это пошло не так, поскольку эта линия была единственной вещью между двумя отпечатками всех элементов массива. Я подозревал, что мое динамическое распределение было неправильным, но тогда я не должен был сначала сканировать некоторые значения в массивы.

Любые советы будут оценены. Заранее спасибо.

1 ответ

Решение
*arr = malloc(m*sizeof*arr)

Это выделяет m объекты размером с *arr, но ты хочешь **arr, В некоторых других распределениях также отсутствует уровень косвенности. Они должны быть:

В iallocate1D:

*arr = malloc(m * sizeof **arr)

В callocate2D:

*arr = malloc(m * sizeof **arr);

(*arr)[i] = malloc(n * sizeof *(*arr)[i]);

В loadCell:

*cell = malloc(sizeof **cell);
Другие вопросы по тегам