1. 程式人生 > >C++陣列到底可以開多大?

C++陣列到底可以開多大?

  一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分  
  1、棧區(stack)—   由編譯器自動分配釋放   ,存放函式的引數值,區域性變數的值等。其  
  操作方式類似於資料結構中的棧。  
  2、堆區(heap)   —   一般由程式設計師分配釋放,   若程式設計師不釋放,程式結束時可能由OS回  
  收   。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。  
  3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的  
  全域性變數和靜態變數在一塊區域,   未初始化的全域性變數和未初始化的靜態變數在相鄰的另  
  一塊區域。   -   程式結束後由系統釋放。  

  4、文字常量區   —常量字串就是放在這裡的。   程式結束後由系統釋放  

  5、程式程式碼區—存放函式體的二進位制程式碼。  

  這是一個前輩寫的,非常詳細    
  //main.cpp    
  int   a   =   0;   全域性初始化區    
  char   *p1;   全域性未初始化區    
  main()    
  {    
  int   b;   棧    
  char   s[]   =   "abc";   棧    
  char   *p2;   棧    
  char   *p3   =   "123456";   123456/0在常量區,p3在棧上。    

  static   int   c   =0;   全域性(靜態)初始化區    
  p1   =   (char   *)malloc(10);    
  p2   =   (char   *)malloc(20);    
  分配得來得10和20位元組的區域就在堆區。    
  strcpy(p1,   "123456");   123456/0放在常量區,編譯器可能會將它與p3所指向的"123456"  

  優化成一個地方。    

以上為他人部落格內容。

總而言之,

函式內申請的變數,陣列,是在棧(stack)中申請的一段連續的空間。棧的預設大小為2M或1M,開的比較小。

全域性變數,全域性陣列,靜態陣列(static)則是開在全域性區(靜態區)(static)。大小為2G,所以能夠開的很大。

而malloc、new出的空間,則是開在堆(heap)的一段不連續的空間。理論上則是硬碟大小。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
				//在本人環境中
int c[20000][20000]; //全域性陣列能開到20000*20000
int main()
{
	int b[1024*505];
	int b2[700*700];
	char a[4*518028];
	int b1[500000]; //5*10^5  函式中的char陣列最大能開4*518028,int最大能開到518028。
	static int c[20000][20000]; //static能開到10^7*10^7。       注意 static和 全域性開的是同一塊空間
	printf("1");
};