繁体   English   中英

在C中将多维数组转换为单维

[英]convert multidimensional array to single dimensional in C

如果我在C中定义了如下数组:

int B[d1][d2][d3][d4][d5][d6][d7][d8][d9];

然后,很容易将“ B”转换为一维。 但是如果我在C中有一个数组,该数组的定义如下:

int********* A;
//which will be allocated as follows for example
A = (int*********) malloc(N*sizeof(int********));
for(int i=0; i<N; i++)
{
 //differentSizes will be distinct for every "i"
 //the same distinctness of sizes will be for every other 
 //inner parts of all inner for loops
 compute(&differentSizes);
 A[i] = (int********) malloc(differentSizes*sizeof(int*******));
 for(...)
 {
  ...
 }
}

其中“ A”的每个维度的尺寸都非常大,并且对于“ A”的所有内部阵列/子阵列而言,它们都是不同的。

我的问题:是否有一种有效的方法可以将“ A”转换为一维? 如果可能,您可以举一个简单的例子吗? 谢谢!

我看不到你的问题。 多维数组在内存中是连续的,因此类型转换将起作用:

int B[13][37];
int *oneDimension = (int *)B;

从现在开始,您可以通过计算B在每个维度上的大小的适当偏移量来访问B的元素; 使用上面的示例:

int valueAtB_2_6 = oneDimension[2 * 13 + 6];

声明数组所有内容的方式将在内存中是连续的。 如果您可以确定元素的数量,则可以将数组复制到一个一维或遍历原始维,这取决于您要执行的操作:

int* singleIndex = (int*)B;

for (int i = 0; i < d1 * d2...dN; i++)
{
    printf("Element # %d = %d\n", i, *singleIndex);
}

例如。

现在,如果您正在对数组进行堆初始化,那么这将不起作用,因为所有内存都将散布在堆上,但是对于静态/堆栈分配的数组则可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM