C 中动态二维数组分配的正确解释

标签 c arrays malloc calloc

我无法正确解释在 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 调用中都存在拼写错误

最佳答案

假设 matix_d 是明确的。

第二个函数创建两个内存区域。一个用于存储指向列的指针,一个用于保存数据本身。

第一层数组中的每个“位置”都会存储第二层内存区域中的一个位置。

存储和收集内存第二区的方法有点困惑。首先 arr[0] 被赋值并用 *arr 检索。哪个是一样的。

此外,当向指针加 1 时,指针值会随着指针指向的数据的大小而增加。所以 ((double*)0) + 1 与 ((double*)sizeof(double)) 相同。

在我看来,最好使用指向第二个内存区域的本地指针并在 for 循环中使用该指针。

其次,sizeof不对。你想分配 (cols * rows) double 。使用 sizeof(**arr) 或仅使用 sizeof(double)。

double** matrix_d2( long int Nrows, long int Ncols ) {
    long int  ii;
    double* data;
    double**  arr;
    // allocate pointers to rows
    arr = calloc( Nrows , (sizeof arr) );
    // allocate data rows * cols
    data = calloc( Nrows*Ncols, (sizeof **arr) );
    // set pointers to rows
    for( ii=0 ; ii < Nrows; ii++)
        arr[ii] = (data + (Ncols*ii));
    return arr;

这对您理解代码有帮助吗?

关于C 中动态二维数组分配的正确解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33723082/

相关文章:

c - 在 C 中过滤 Linux 上的 UDP 环回

javascript - 无法到达已删除的数组对象

c - malloc...意外行为c编程

c - malloc函数将所有数据分配到同一内存地址

仅在错误期间创建日志文件

使用 system() 使用 gcc 进行编译

c - C 中的算法 - 玩数字 - 单位位置为 3 的数字

java - 文件到数组到 JTable(索引越界)

python找到两个numpy数组的交点

c - 在我可以在循环中使用的相同变量名中 malloc 一些其他内存量之前,我需要采取哪些步骤?