C++開大數組溢出問題
這個也是最近遇到的問題,在開了一個將近800萬的數組後,vscode報錯了:
Segmentation fault:11
,原來是開大數組,棧溢出的問題。
1 解決方法
方法1
- 利用malloc分配數組存儲
#include<iostream>
using namespace std;
int main(){
int *ptr;
ptr = (int*)malloc(sizeof(int)*8000000);
free(ptr); //記得釋放內存
return 0;
}
方法2
- 全局變量/靜態變量存儲
#include<iostream>
using namespace std;
int main(){
static int arr[8000000];
return 0;
}
- 不同電腦內存可能會有限制。
2 值得注意
- 用 C/C++ 語言直接定義數組,數組空間是開闢在 C 語言佔用內存空間的棧區。
- 而棧區開闢的內存有限(一般2M)導致內存溢出。
這裏需要普及一下C語言內存分配的問題,C語言佔用的內存可以分爲5個區:
區域 | 作用形式 |
---|---|
代碼區(Text Segment) | 用於放置編譯過後的代碼的二進制機器碼。 |
堆區(Heap) | 用於動態內存分配。一般由程序員分配和釋放,若程序員不釋放free(),結束程序時有可能由操作系統回收。(其實就是malloc()函數能夠掌控的內存區域) |
棧區(Stack) | 由編譯器自動分配和釋放,一般用來存放局部變量、函數參數。 |
全局初始化數據區/靜態數據區(Data Segment) | 顧名思義,就是存放全局變量和靜態變量的地方。這個區域被整個進程共享。 |
未初始化數據區(BSS) | 在運行時改變值。改變值 / 初始化的時候,會根據它是全局變量還是局部變量,進到他們該去的區。 |