如何在C中操纵动态多维数组

时间:2011-05-20 21:31:35

标签: c dynamic multidimensional-array

我需要将大型多维数组分配为char a[x][32][y],x * 32 * y大约为6~12G。 (x,y在运行时被确定。)

我想出了一种方法char *a=malloc(x*32*y),并*(a+32*y*i+y*j+k)使用a[i][j][k]

然而,与a[i][j][k]相比,这看起来并不那么方便。

还有更好的方法吗?

添加了: 它是a[x][32][datlen],其中datlen在运行时被确定,x是在考虑内存的情况下设置的。

数组中的整个数据都是新的。我有16或32GB内存的数学运行它。

3 个答案:

答案 0 :(得分:4)

错误:在引用动态分配的内存时,您仍然可以使用[i] [j] [k]语法。

正确:使用宏来至少使工作更轻松

#define A(i,j,k) *(a+32*y*i+y*j+k)
A(1,2,3) would then do the right thing.

答案 1 :(得分:1)

我怀疑你会找到一个系统,它会为你分配大*的连续内存。你将不得不使用某种类型的分块策略。

您需要问:“您的数据访问模式是什么?”

如果它有一定的步幅(可以是1D或2D),请使用它为每个块选择合适的内存分配。使用数据结构来表示每个步幅(可能只是包含字符数组的结构)。

编辑:我没有注意到您使用a[i][j][k]语法访问新发现的12G连续内存块的第二个“问题”。在我所知道的任何消费者C级分销中都不会发生这种情况。

(*)和640k应该是任何人的足够记忆。

答案 2 :(得分:0)

由于这是C,因此无法将所有内容都包装到一个方便的C ++对象中。

但我会做类似的事情。设计一系列分配,操作和销毁你的新数据类型的函数。

要读取或写入一段数据,请调用一个函数。切勿直接触摸数据。实际上,如果您可以对数据使用void*句柄,甚至不将实际数据类型放在包含的头文件中,那么这是最好的事情。

通过这种方式,您可以将函数定义为在一个非常大的内存块,一组大内存块甚至是块上的磁盘数据库上运行。

现在我写了这封信,让我部分收回。如果需要更高性能,可能需要将包含的头文件中的所有函数定义为内联定义。这将使您的编译器几乎消除所有函数调用开销并积极优化。

我承认matrix_set(x, y, z, value)不如matrix[x][y][z] = value那么漂亮,但它也能正常运作。