动态2D数组如何存储在内存中?

时间:2012-01-04 21:10:16

标签: c memory-management multidimensional-array

2D数组如何存储在内存中?

我想到了以下方法,其中行存储为连续的内存块。

|的 _ __ _ __ _ __ || _ __ _ __ _ __ | __ _ __ _ __ | _ __ _ 的__ _ _ | ... | _ __ _ __ _ __ < /强> |

元素的加入类似于(i,j) - &gt; n * i + j,其中n是矩阵的维数(假设它是nxn)。

但是,如果我想添加一个新列怎么办?我必须更新每一行中的每个第(n + 1)个元素,并将它们移到右边,但这在计算上太贵了。

另一种选择是将矩阵复制到新位置,并使用新列的元素动态更新行。但如果阵列很大,这也不太有效。

最后我想到的第三个选项是为每一行分配固定数量的内存,当我添加一个新列时,我不必将行向右移动。

我不能在内存中留有空白,所以所有的块都必须是连续的。

我不是要求使用指针和实际RAM内存的C实现,我只是对在内存中存储动态2d数组的理论方法感到好奇,因为它很容易附加新行或者它的列。

还有其他更有效的方法吗?

2 个答案:

答案 0 :(得分:4)

如果您知道要创建要扩展的2D阵列,则一种方法是在每个维度中分配更多大小。跟踪实际大小和分配的大小,当实际大小超过分配大小时,请执行以下操作:

  • 分配大小的两倍
  • 将旧阵列中的所有数据复制到新阵列
  • 释放旧阵列

这将是分配动态1D阵列的常用技术的2D扩展。

答案 1 :(得分:1)

如果您需要扩展数组并在内存中连续,实现此目的的一种方法是简单地使用1d数组并“伪造”第二维。

如果您的初始1d阵列比所有2d阵列所需的空间更多,则不需要在内存中移动(可能避免间隙)。但是,根据您实现它的方式,一个使子阵列之一生长的插入可能需要将后面的元素向下移动(您的阵列中也可能存在间隙,但我认为这违反了您的无间隙要求)。

如果你确实需要2个维度,那么greg的答案是要走的路。 如果您知道数据的大小,那就更容易了。