Я недавно столкнулся с концепцией динамически распределенных массивов и применил его. Я столкнулся со следующей проблемой.Динамически выделенный массив в структуре, неожиданно модифицированной в C
В структурах я определил некоторые указатели, которые будут выделены позже:
typedef struct CELL {
int total;
int* number;
char** type;
}CELL;
В функции этого структура имеет свою память, выделенную таНос(), затем два указателя выделяются массивы 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;
, который я думал, что не имеет отношения, то массив символов 2D также изменен. Перед этой модификацией char [1] [0] == 'L', но после этого char [1] [0] == '\ 3'. Я напечатал каждый элемент и обнаружил, что только этот элемент был изменен. Достаточно много, но я не мог понять, где это пошло не так, поскольку эта строка была единственной вещью между двумя отпечатками всех элементов массива. Я подозревал, что мое динамическое распределение было неправильным, но тогда я не должен был сканировать некоторые значения в массивы в первую очередь.
Любые подсказки будут оценены. Заранее спасибо.
Та же проблема сохраняется. И я думал (* arr) [i] уже является указателем на char? – robinchm
теперь мой код похож на * arr = malloc (m * sizeof (char *)); (* arr) [i] = malloc (n * sizeof (char)); и все остается прежним. Я думал, что если за sizeof следует указатель, он вернет том, занятый данными, указанными указателем. Я ошибаюсь? – robinchm
Я попытаюсь придумать код для тестирования. Исходный код составлял несколько тысяч строк. И проблема в том, что вы не можете воспроизвести проблему. Без последней строки все получилось. – robinchm