****新来的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 = []然后用你想要的任何东西填充它来制作一个(几乎)任何大小或维度的数组。
谢谢!
答案 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}}。