【问题标题】:Possible to allocate 2D array in a single malloc and still get to use [ ][ ] syntax? [duplicate]可以在单个 malloc 中分配 2D 数组并且仍然可以使用 [ ][ ] 语法? [复制]
【发布时间】:2017-07-13 15:50:28
【问题描述】:

通常,当我创建一个动态二维数组时,我会首先 malloc 行指针,然后循环遍历行并 malloc 每一行。所以,例如:

array = malloc( row_count * sizeof( int* ) );
for( int x = 0; x < row_count; x++ ){
    array[x] = malloc( column_count * sizeof( int ) );
}

完成后,我可以使用如下语法:

data[3][5] = 52;

设置或获取值。这样做的问题是执行了许多 malloc,这既是 cpu 密集型的,又会导致许多内存碎片,所有这些碎片都必须单独释放。另一种方法是将数组分配为单个内存块。但是,如果这样做,我将无法再使用 [ ][ ] 语法来引用数组中的元素,而是必须执行以下操作:

data[ row_index * column_size + column_index ] = 52;

手动计算到连续块的正确偏移量。有没有办法为数组分配一块内存,但仍然使用 [ ][ ] 语法?

【问题讨论】:

  • 只有一种方法可以分配二维数组。这确实只使用一个malloc 调用。其他任何东西都不是二维数组。当然,您必须对 2D 数组使用嵌套索引运算符(或添加/取消引用,但完全相同)。
  • 我不久前的一个想法是为单个数组分配内存,然后创建一个指向数组[0]、数组[colsize]、数组[2*colsize]的指针数组,等等。你只使用一次 malloc,但保留一些额外的指针。不确定是否真的可以干净地实施,或者是否值得麻烦。编辑:检查上述问题的答案
  • @neoaggelos:那不是二维数组。
  • @EugeneSh。那个“重复”与我的问题无关。我没有“转换”任何东西。

标签: c arrays pointers memory-management


【解决方案1】:

如果可变长度数组类型可用(自 C99 起;在 C11 中成为可选,但广泛可用),您可以使用类似的东西:

size_t rows, cols;

/* calculate rows and cols based on user input, etc. */

int (*data)[cols] = malloc(sizeof *data * rows);

分配可以索引为二维数组的连续空间。

如果rows 的数量未知,但列数在编译时已知,则可以使用,即使没有 VLA:

#define COLS  10   /* or some known compile-time value */

size_t rows;

/* calculate rows based on user input, etc. */

int (*data)[COLS] = malloc(sizeof *data * rows);

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 2010-11-13
    • 1970-01-01
    • 2018-06-04
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多