C.中动态2D阵列分配的正确解释



我无法正确解释C中动态分配2D阵列的两种不同方式。

第一种方法读取(为了可读性,我省略了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调用)。

你们中的一个人能给我指一下正确的解释吗?非常感谢!}

EDIT:两个方法的第一个calloc调用中都有一个拼写错误

假设matix_d是清除的。

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

阵列的第一级中的每个"位置"都存储在存储器的第二区域中的位置。

存储和收集第二个内存区域的方法有点令人困惑。分配了第一个arr[0],并使用*arr进行检索。这是一样的。

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

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

其次,尺寸不对。您想要分配(cols*行)的双精度。请使用sizeof(**arr)或仅使用sizeof。

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;

这对你解释代码有帮助吗?

相关内容

  • 没有找到相关文章