2011-05-08 134 views
2

此代码是给我段错误:C++数组声明问题

#include <stdio.h> 

int main(int argc,char** argv[]){ 

int ar[20000000]; 

return 0; 

} 

但是,如果我通过0减少数组的大小 - 那么它的罚款。我超过了最大尺寸?如果我想存储整数量呢?谢谢。

回答

6

这可能与您试图在堆栈上分配超过70兆字节的数据有关。 Windows具有每个线程IIRC的默认堆栈大小为1兆字节。尝试用new的空闲存储分配它,就像这样:

int* ar = new int[20000000]; 

,并使用它时,你就大功告成了,delete[]它:

delete[] ar; 
+0

是什么让你认为它是70兆字节?它并不是说在C/C++标准中int是32位。 – 2011-05-09 00:19:50

1

int ar[20000000]在堆栈上声明,采取APPX 70MB +(76.2939453MB)的内存......也许你用完了空间?

使用new在堆上分配。

+0

更喜欢80MB。 – joce 2011-05-08 21:05:39

+1

实际上76.2939453兆字节。 – 2011-05-08 21:05:58

+1

76.2939453 mebibytes(MiB),但80兆字节(MB)。 – schnaader 2011-05-08 21:11:04

3

你得到堆栈溢出:D一个真正的。

在堆上分配的存储器,使用new

int* ar = new int[ 20000000 ]; 
// do stuff with ar 
delete[] ar; // do **not** forget about this 
1

您可能超过由堆栈帧,它是由编译器执行的允许的大小。如果您要动态分配空间,例如:

 
int array = new int[SIZE] 

您将受到操作系统和硬件而不是您的编译器的限制。 (这是因为在堆上动态分配内存并将其存储,而局部声明的变量存储堆栈,其中有一个严格的大小限制上。)