2

****C新手!****

我在 Windows 7(64 位版本)上运行 Dev-C++ 4.9.9.2 我的电脑有 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

但恐怕我对 c 语言太初学者了,无法理解简短的解释。作为背景:我来自 python,你可以通过声明 MyArray=[] 来创建一个(几乎)任何大小或维度的数组,然后用你想要的任何内容填充它。

谢谢!

4

1 回答 1

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是指向 的 6 元素数组的指针floatmyArray[i]因此为我们提供了after的第i' 个 6 元素数组的地址。floatmyArray

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

于 2013-01-02T20:04:44.663 回答