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)
手动计算连续块中的正确偏移量.有没有办法为数组分配单个内存块,但仍然使用[] []语法?
如果可变长度数组类型可用(因为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)
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |