C大型二维阵列创建

时间:2013-01-02 19:48:18

标签: c arrays multidimensional-array malloc

****新来的C!****

我在Windows 7上运行Dev-C ++ 4.9.9.2(64位版本) 我的电脑有39GB的物理内存。

我正在尝试创建一个大型二维数组。我已经创建了代码,告诉我它有多少维度,以及每个维度中有多少项。

作为一个例子,假设数组是二维的:100万项长,6宽:

[1,2,3,4,5,6],
[1,2,3,4,5,6],
[1,2,3,4,5,6],
...and on to one million items.

我试过了:

float MyArray[1000000][6];

但这会破坏Dev-C。当我尝试初始化大于的数组时似乎失败了:

float Myarray[86486][6];

我想我正在经历一个“堆栈溢出”,这让我很开心,因为这是这个网站的名称。

我一直在挖掘,似乎我需要使用malloc来帮助C了解要保留多少内存。我已经看到了如何使用它来设置一维数组的很好的例子,但我非常欣赏如何使用二维数组设置它的示例代码。

我在这里看到了例子:Initializing a large two dimensional array in C

但我担心我太过初学者了解这个简短的解释。 作为背景:我来自python,你可以通过声明MyArray = []然后用你想要的任何东西填充它来制作一个(几乎)任何大小或维度的数组。

谢谢!

1 个答案:

答案 0 :(得分:3)

是的,你正在遇到单个堆栈框架大小的限制。

这是一种方法:

#include <stdlib.h>
...
int main(void)
{
  /**
   * declare myArray as a *pointer* to a 6-element array of float
   */
  float (*myArray)[6];
  /**
   * dynamically allocate space for 1 million objects of type
   * "6-element array of float"
   */
  myArray = malloc(sizeof *myArray * 1000000);
  ...
  myArray[i][j] = ...;
}

为什么会这样:

下标操作a[i]被解释为*(a + i);也就是说,我们在i(数组的基地址)之后计算a'元素(非字节)的地址并取消引用它。由于myArray是指向float的6个元素数组的指针,myArray[i]i提供了float个6个元素数组myArray的地址在myArray之后。

这种方法的优点是内存分配在一个连续的块中,你可以像任何二维数组一样下标{{1}}。