一、C語言分為幾下幾類:
1.棧區stack)
由編譯器自動分配和釋放,存放函數的函數值,局部變量的值等。操作方式類似於數據結構中的棧。
2.堆區heap)
一般由程序員分配和釋放,若程序員不釋放,程序結束時可能由操作系統回收。注意它同數據結構的堆是兩回事,分配方式類似於鏈表。
3.全局區靜態區static)
全局變量和靜態變量的存儲是放在一起的,初始化的全部變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域 。程序結束後由系統釋放。
4.文字常量區
常量字符串就是放在這裡的。程序結束後就由系統釋放。
5.程序代碼區
存放函數體的二進制代碼。
#define不占用內存單元。C++編譯器通常並不給const常量分配存儲空間,而是把const變量的定義保存在符號表裡。在VC中,const變量與一般變量一樣,都分配內存空間.
在函數體中定義的變量通常是在棧上,用malloc,calloc,realloc等分配內存的函數分配得到的就是在堆上。
在所有函數體外定義的是全局量,加了static修飾符後不管在哪裡都存放在全局區靜態區),在所有函數體外定義的static變量表示在該文件中有效,不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。
另外,函數中的"adgfdf"這樣的字符串存放在常量區。
比如: int a = 0; //全局初始化區
char *p1; //全局未初始化區
void main() {
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //123456{post.content}在常量區,p3在棧上
static int c = 0; //全局靜態)初始化區
p1 = (char *)malloc(10); //分配得來得10字節的區域在堆區
p2 = (char *)malloc(20); //分配得來得20字節的區域在堆區
strcpy(p1, "123456"); //123456{post.content}放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊 }
二、C++中分為以下幾類:分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區
1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變量的存儲區。裡面的變量通常是局部變量、函數參數等。
2.堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
3.自由存儲區,就是那些由malloc等分配的內存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。
4.全局/靜態存儲區,全局變量和靜態變量被分配到同一塊內存中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同占用同一塊內存區。
5.常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改當然,你要通過非正當手段也可以修改)
本文出自 “IT民工一枚” 博客,請務必保留此出處http://7633061.blog.51cto.com/7623061/1266355