【问题标题】:convert multidimensional array to single dimensional in C在C中将多维数组转换为一维
【发布时间】:2012-10-18 00:22:10
【问题描述】:

如果我有一个在 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[d1][d2][d3][d4][d5][d6][d7][d8][d9] B;?您的意思是:int B[d1][d2][d3][d4][d5][d6][d7][d8][d9];
  • @Mike 抱歉,已更改,谢谢!
  • 您的问题是“如何将分配为 A 的数组转换为像 B 的数组?”
  • 旁注:写A = malloc(N*sizeof(*A)); 而不是A = (int*********) malloc(N*sizeof(int********));。这样一来,它的可读性更高,更不容易出错,更不用说更短了。
  • @AShelly 不,我的问题是如何将像 A 这样的数组转换为一维数组。谢谢!

标签: c arrays multidimensional-array


【解决方案1】:

我没有看到你的问题。多维数组在内存中是连续的,因此可以进行类型转换:

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

从现在开始,您可以访问B 的元素,方法是计算其在每个维度上的大小的适当偏移量;使用上面的例子:

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

【讨论】:

  • 这适用于静态/全局/本地数组,但不适用于在堆上分配的数组(如果其所有行和维度都在循环中单独分配)。
  • @EarlGray 这些类型的数组不是使用int B[dim1][dim2][dim3]; 创建的。
【解决方案2】:

声明数组的方式所有内容在内存中都是连续的。如果您可以确定元素的数量,您可以将数组复制到一维或迭代原始数组,这取决于您想要做什么:

int* singleIndex = (int*)B;

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

例如。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2019-06-29
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多