我最近遇到了动态分配数组的概念,在应用它时遇到了以下问题。
在结构中,我定义了一些稍后要分配的指针:
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'之后。我打印了每个元素,发现只修改了这个元素。已经足够了,但我无法弄清楚它出错的地方,因为那条线是所有数组元素的两个打印之间唯一的东西。我怀疑我的动态分配是错误的,但是我不应该首先将一些值扫描到数组中。
任何提示都将不胜感激。提前谢谢。
答案 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