【发布时间】:2016-02-16 19:48:46
【问题描述】:
我无法正确解释在 C 中动态分配二维数组的两种不同方式。
第一种方法读取(为了便于阅读,我省略了if(arr==NULL) 检查):
double** matrix_d( long int Nrows, long int Ncols ) {
long int ii;
double** arr;
// allocate pointer to rows
arr = calloc( Nrows , (sizeof *arr));
for( ii=0 ; ii < Nrows; ii++) {
// allocate pointer to each column (?)
arr[ii] = calloc( Ncols , (sizeof **arr) );
}
return arr;
}
第二种方法读取(同样,省略了对 calloc 的返回值的检查):
double** matrix_d2( long int Nrows, long int Ncols ) {
long int ii;
double** arr;
// allocate pointers to rows
arr = calloc( Nrows , (sizeof *arr) );
// allocate rows (?)
arr[0] = calloc( Nrows*Ncols, (sizeof arr) );
// set pointers to rows (?)
for( ii=0 ; ii < Nrows; ii++)
arr[ii] = (*arr + Ncols*ii);
return arr;
注释行可能表明我缺乏正确理解内存分配......尤其是第二种方法让我感到困惑(但在这个意义上似乎“更好”,它只需要 2 个 calloc/malloc 调用) .
你们中的某个人能指出我的正确解释吗?那将不胜感激! }
编辑:这两种方法的第一次 calloc 调用都有一个错字
【问题讨论】:
-
arr = calloc( Nrows , (sizeof arr));在这两个例子中都应该是arr = calloc(Nrows, sizeof *arr);。 -
错误的星数。这是一条经验法则:
x = calloc(n, sizeof(*x))。如果您的代码与此模式不匹配,请用拇指戳键盘直到匹配为止。 -
您的代码中没有二维数组。 指针不是数组。
-
@alk 谢谢,这是一个错字
-
OT:所有这些
long ints 最好是size_ts 或至少是未签名的。