2015-09-05 88 views
1

将数组声明为全局我可以给它的大小为5000000 bt当我在main ?为什么在C++中声明一个数组是全局的,它的大小可以大于在主声明中的大小

工作正常

#include<iostream> 

int arr[5000000]; 
using namespace std; 
int main() 
{ 
    arr[0]=1; 
    cout<<arr[0]; 
    return 0; 
} 

分段故障

#include<iostream> 

using namespace std; 
int main() 
{ 
    int arr[5000000]; 
    arr[0]=1; 
    cout<<arr[0]; 
    return 0; 
} 
+0

使用'std :: vector arr(5000000);'在堆上分配数据。 –

回答

2

main中,数组在堆栈上分配。堆栈大小的默认限制是8MB。该数组为20 MB,因此会发生堆栈溢出。

全局数组在数据段上分配。只要有可用内存,数据段的大小默认是无限的。

运行ulimit -a命令在bash查看程序的默认限制。

4

在程序解剖this图像看看。在你的第二个实现中,内存分配在堆栈上,根据图片,堆栈限制为8MB(不同的机器可能有不同的限制)。你的阵列将占用大约20MB的内存。数据段大于8MB,因此在尝试分配这种阵列时不会引发错误

相关问题