C++開大數組溢出問題

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) 在運行時改變值。改變值 / 初始化的時候,會根據它是全局變量還是局部變量,進到他們該去的區。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章