代码之家  ›  专栏  ›  技术社区  ›  Green goblin

为具有最少malloc调用次数的2D阵列分配内存

  •  3
  • Green goblin  · 技术社区  · 13 年前

    我正在使用以下代码片段为2D阵列分配内存,使用的最小数量为 malloc() 电话。

    我想使用下标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 。为什么?

    2 回复  |  直到 13 年前
        1
  •  7
  •   AnT stands with Russia    13 年前

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

    停止尝试使用 ptr程序 用于阵列访问。使用 p 。访问您的数组元素 p[i][j] 它应该起作用。

    事实上,我会摆脱 ptr程序 并按照以下方式进行内存分配

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

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

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

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

        2
  •  0
  •   Mahmoud Fayez    13 年前

    试试这个:

    #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;
    }