Динамически размещенный массив в структуре, неожиданно измененной в 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);