程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C/C++內存劃分

C/C++內存劃分

編輯:關於C語言

一、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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved