使用最少数量的malloc调用为2D数组分配内存

Gre*_*lin 3 c malloc runtime-error

我使用下面的代码片段,使用最少的malloc()调用次数为2D数组分配内存.

我想使用下标p [i] [j]访问数组.

#define ROW 3
#define COL 2

int main()
{
    void **ptr = malloc( ROW*COL* sizeof(int) );

    int (*p)[COL] = ptr;

    int i, j;

    for( i = 0; i < ROW; ++i )
            for( j = 0; j < COL; ++j )
                    scanf("%d", &ptr[i][j]);

    for( i = 0; i < ROW; ++i )
    {
            for( j = 0; j < COL; ++j )
                    printf("%d ", p[i][j]);
            printf("\n");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

无论输入是什么,程序都正确输出.

但是,它显示 运行时错误 .为什么?

AnT*_*AnT 7

如果数组维度在编译时是已知的(如在您的示例中),那么您确实可以在一次malloc调用中分配内存.但是您必须使用正确的指针类型来访问该内存.在你的情况下,这将是你的p指针.您的p指针被正确声明,但由于某种原因,您完全忽略了它的存在scanf并使用了它ptr.

停止尝试ptr用于阵列访问.使用p.访问您的数组元素p[i][j],它应该工作.

事实上,我会ptr完全摆脱并以下列方式进行内存分配

int (*p)[COL] = malloc(ROW * sizeof *p);
Run Code Online (Sandbox Code Playgroud)

此外,由于两个维度在编译时都是已知的,因此您实际上可以将其分配为

int (*p)[ROW][COL] = malloc(sizeof *p);
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,你必须记住访问数组(*p)[i][j](注意*).选择您喜欢的方法.