2015 08 24記憶體分割槽

2021-07-05 15:53:12 字數 2129 閱讀 7131

1、

//記憶體區域的劃分(從低到高)

//1.棧區

//2.堆區++++++++++++++重點+++++++++++

//3.靜態區(全域性區)

//4.常量區

//5.**區

2、static

intnumber =10;

//被static 修飾的全域性變數生命週期隨著程式的建立而建立,隨著程式的消失而消失;

3、//區域性變數:定義在函式內部的變數就叫做區域性變數,區域性變數都是儲存在棧區

3、//記憶體管理的時候系統也是遵循記憶體對齊原則,因為這樣可以提高記憶體的分配效率

4、//靜態區(全域性區)

//有static 修飾的變數存放在靜態區,靜態區的變數有乙個特點,整個程式執行中,只被初始化一次;如果人為未初始化,系統預設初始化為0

5、//系統提供的函式由於使用比較頻繁,我們把它存放在棧區,原因是棧區的內容會被反覆的建立銷毀,不需要我們去管理記憶體還是因為棧區的記憶體開闢和釋放的記憶體

6、//**區:程式中執行的函式或者變數等等語句都會編譯成cpu指令,存放在**區; 7、

malloc

calloc

realloc

memset  (要做釋放free(p);操作並賦值p =null)

memcpy

memcmp (不用做釋放操作) 

//  

free

(p);

//釋放掉p 指向的堆區空間,只是標記刪除,不清空裡面的內容

//   free(p); 過度釋放,釋放多次,過度釋放會造成crash 崩潰

p = null

;  //指向的是無效的空間,防止野指標錯誤

(1)malloc:申請記憶體的函式

//   void   *malloc( size_t)

//   void * ,泛型別,void * 返回的指標可以賦值給任何型別的指標,int * ,float* ,char *,short*

//  size_t 代表申請多少個位元組的大小的記憶體空間

//   malloc  的作用,申請的 size 個位元組大小的空間,並把申請的空間首位址返回

(2)//calloc(size_t, size_t)

//兩個引數的意思;表示申請n個size大小的空間,返回時申請空間的首位址,但是它在申請空間的時候會多一步處理,清除麼乙個位元組裡的內容,也就是清零操作,正是因為calloc 多了一 步 清零操作,執行效率要比malloc低;

//realloc(p, n)  //記憶體的重新分配,第乙個引數是位址,第二個引數是重新分配的記憶體大小

(4)//使用relloc 重新分配空間的時候,若再原有分配空間的基礎上可以連續載增加   n (原有空間大小 )個空間大小,指標指向不會改變;若這時不可以連續增加(n - 原有空間大小),會將之前的空間給釋放掉,然後再去堆區的其他位置開闢連續的n個空間大小的記憶體,指標的指向發生改變了;

注意:重新分配的空間需要接收

// int *p6 = malloc(12);

//  *p6 = 10;

//  *(p6 + 1) = 20;

//  *(p6 + 2) = 30;

// //  

p6 = realloc(p6, 20);//重新分配空間的大小

//  *(p6 + 3) = 40;

// *( p6 + 4) = 50;

// //重新分配的空間會把之前空間的內容給拷貝過來,放到相對的位置,所以需要遍歷

// for (int i = 0; i < 5; i ++)

//  free(p6);

// p6 = null;

(3)memset(開始位址, n, size);  

給定乙個開始位址,將size位元組的空間大小內的資料置為n,若n為0,size為10,就是把10個位元組中的資料置為0;

(4)memcpy(dest, source, n);  

//從源source指標開始的位置,向目的指標拷貝n個位元組的資料;注意:前面的空間要足夠大;

(5)memcmp(p1, p2, n);

比較p1 和 p2 指向的記憶體裡的內容是否相同,比較n 個位元組,返回值是0,相等;不同的時候返回差值;比較過程是逐個位元組比較,返回第一對對應位元組位置不同資料的差值

c 記憶體分割槽

堆 由程式設計師手動分配和釋放,完全不同於資料結構中的堆,分配方式類似鍊錶。由malloc c語言 或new c 來分配,free c語言 和delete c 釋放。若程式設計師不釋放,程式結束時由系統釋放。棧 由編譯器自動分配和釋放的,存放函式的引數值 區域性變數的值等。操作方式類似資料結構的棧。...

C C 記憶體分割槽

堆區 由程式設計人員手動申請,手動釋放,若不手動釋放,程式結束後由系統 生命週期是整個程式執行期間。使用malloc或者new進行堆的申請,堆的總大小為機器的虛擬記憶體的大小。ps self view 由malloc申請的叫做堆區,new申請的叫做自由儲存區 棧區由系統進行記憶體的管理。主要存放函式...

C 記憶體分割槽

前言 最近正在學習有關static的知識,發覺對c 的記憶體分割槽不是很了解,上網查了很多資料,遂將這幾天的學習筆記進行了簡單整理,發表在這裡 棧區 stack 主要用來存放函式的引數以及區域性變數。棧區由系統進行記憶體管理,在函式完成執行時,系統會自行釋放棧區的記憶體,而不需要使用者參與管理。整個...