3

我正在使用下面的代码片段使用最少的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;
}

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

但是,它显示 Runtime error 。为什么?

4

2 回答 2

7

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

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

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

int (*p)[COL] = malloc(ROW * sizeof *p);

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

int (*p)[ROW][COL] = malloc(sizeof *p);

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

于 2012-08-26T21:02:46.383 回答
0

试试这个:

#define ROW 3
#define COL 2

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

    int *p[COL];
    int i, j;

    fot (i = 0; i < COL; i++)
        p[i] = ptr + ROW * i;

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

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

    free(ptr);
    return 0;
}
于 2012-08-26T21:10:05.100 回答