在C中意外修改的结构中动态分配的数组

时间:2014-02-18 18:35:35

标签: c arrays dynamic-allocation

我最近遇到了动态分配数组的概念,在应用它时遇到了以下问题。

在结构中,我定义了一些稍后要分配的指针:

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;

我认为不相关,2D char数组也被修改。在此修改之前char [1] [0] =='L',但在此char [1] [0] =='\ 3'之后。我打印了每个元素,发现只修改了这个元素。已经足够了,但我无法弄清楚它出错的地方,因为那条线是所有数组元素的两个打印之间唯一的东西。我怀疑我的动态分配是错误的,但是我不应该首先将一些值扫描到数组中。

任何提示都将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

*arr = malloc(m*sizeof*arr)

这会分配大小为m的{​​{1}}个对象,但您需要*arr。其他一些分配同样缺少间接级别。他们应该是:

**arr

iallocate1D

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

callocate2D

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

loadCell