可以在单个malloc中分配2D数组并仍然可以使用[] []语法吗?

Tyl*_*den -1 c arrays pointers memory-management

通常,当我创建动态2D数组时,我将首先对行指针进行malloc,然后遍历行和malloc每行.所以,例如:

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

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

data[3][5] = 52;
Run Code Online (Sandbox Code Playgroud)

设置或获取值.这样做的问题是许多malloc都是cpu密集的并且导致许多内存片段,所有这些都必须单独解除分配.另一种方法是将数组分配为单个内存块.但是,如果我这样做,我不能再使用[] []语法来引用数组中的元素,而是我必须做这样的事情:

data[ row_index * column_size + column_index ] = 52;
Run Code Online (Sandbox Code Playgroud)

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

ex *_*ilo 5

如果可变长度数组类型可用(因为C99;在C11中可选,但可广泛使用),您可以使用以下内容:

size_t rows, cols;

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

int (*data)[cols] = malloc(sizeof *data * rows);
Run Code Online (Sandbox Code Playgroud)

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

如果数量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);
Run Code Online (Sandbox Code Playgroud)