2014-02-18 5 views
0

Я недавно столкнулся с концепцией динамически распределенных массивов и применил его. Я столкнулся со следующей проблемой.Динамически выделенный массив в структуре, неожиданно модифицированной в 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'. Я напечатал каждый элемент и обнаружил, что только этот элемент был изменен. Достаточно много, но я не мог понять, где это пошло не так, поскольку эта строка была единственной вещью между двумя отпечатками всех элементов массива. Я подозревал, что мое динамическое распределение было неправильным, но тогда я не должен был сканировать некоторые значения в массивы в первую очередь.

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

ответ

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); 
+0

Та же проблема сохраняется. И я думал (* arr) [i] уже является указателем на char? – robinchm

+0

теперь мой код похож на * arr = malloc (m * sizeof (char *)); (* arr) [i] = malloc (n * sizeof (char)); и все остается прежним. Я думал, что если за sizeof следует указатель, он вернет том, занятый данными, указанными указателем. Я ошибаюсь? – robinchm

+0

Я попытаюсь придумать код для тестирования. Исходный код составлял несколько тысяч строк. И проблема в том, что вы не можете воспроизвести проблему. Без последней строки все получилось. – robinchm

Смежные вопросы