【发布时间】: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