2015-09-05 57 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,因此在嘗試分配這種陣列時不會引發錯誤

相關問題