代码之家  ›  专栏  ›  技术社区  ›  Justin Meiners

C中的动态二维阵列分配

  •  2
  • Justin Meiners  · 技术社区  · 15 年前

    我应该如何在C中分配动态数组?目前我有一个我写的函数 malloc2D 看起来是这样的:

    void* malloc2D(size_t unitSize, uint firstCount, uint secondCount)
    {
        void** pointer = malloc(sizeof(id) * firstCount);
        for (int i =0; i < firstCount; i ++){
            pointer[i] = malloc(unitSize * secondCount);
        }
        return pointer;
    }
    

    它工作得很好,但是我被告知它会对单独分配内存造成很大压力。最好或最传统的方法是什么?

    3 回复  |  直到 10 年前
        1
  •  0
  •   M.M    10 年前

    您可以像这样将数组分配为一个连续的块。假设您需要Ints:

    int (*arr)[secondCount] = malloc( sizeof(int[firstCount][secondCount]) );
    

    您可以将其隐藏在将typename作为宏参数的宏之后,尽管代码非常简单,这不是真正必要的。

        2
  •  5
  •   Sniggerfardimungus    15 年前

    您可以一次分配整个块:

    int ** foo;
    
    foo = malloc(sizeof(int*) * firstCount);
    foo[0] = malloc(sizeof(int) * firstCount * secondCount);
    for (int i=1; i<firstCount; i++)
    {
        foo[i] = foo[0] + i * secondCount;
    }
    
        3
  •  3
  •   Community Mohan Dere    9 年前

    我的建议是保留你所拥有的。

    1. 它已经开发出来了。
    2. 它被测试了。
    3. 它是直观/可读的,不使用宏。
    4. 它是可扩展的。
    5. 没有定量的瓶颈。

    有时,在没有问题的情况下尝试优化可能会损害性能。你对你朋友的理论做了什么基准测试吗?

    malloc 一个大的块需要定位连续的地址空间,甚至可能导致 马洛克 当当前方法成功时失败( address space fragmentation 等)。

    当我说您当前的实现是可扩展的时,我的意思是调整大小很简单。如果你分配给一个[100][3]并且后来意识到你需要一个[100][4]那么你所需要做的就是100 非常 realloc很小,可能不会更改地址。但是,如果宏方法需要调整大小,则需要 realloc 可能不连续存在的整个块。更糟糕的是,由于数学已经改变,数据不再在宏访问的正确位置,因此您需要一系列昂贵的 memmove S.

    概括地说,我认为重要的是要始终记住代码的可读性、可维护性和易用性,并且只有在建立瓶颈之后才能进行优化。