內存空間

1.動態內存分配

 C語言中的一切操作都是基於內存的
  變量和數組都是內存的別名,如何分配這些內存由編譯器在編譯期間決定
  定義數組的時候必須指定數組長度,而數組長度是在編譯期就必須決定的
內存的分配與釋放:
malloc和free:malloc和free用於執行動態內存分配和釋放
 malloc所分配的是一塊連續的內存,以字節爲單位,並且不帶任何的類型信息
 free用於將動態內存歸還系統

void\* malloc(size_t size);
void free(void\* pointer);   

malloc實際分配的內存可能會比請求的稍微多一點,但是不能依賴於編譯器的這個行爲;
當請求的動態內存無法滿足時malloc返回NULL;
當free的參數爲NULL時,函數直接返回
內存空間

calloc和realloc :

 void* calloc(size_t num, size_t size);
 void* realloc(void\* pointer, size_t new_size);

  calloc的參數代表所返回內存的類型信息,calloc會將返回的內存初始化爲0
  realloc用於修改一個原先已經分配的內存塊大小;
  在使用realloc之後應該使用其返回值,當pointer的第一個參數爲NULL時,等價於malloc

2.程序中的 棧、堆、靜態存儲區

棧:函數調用的使用
 棧是現代計算機程序裏最爲重要的概念之一
 棧在程序中用於維護函數調用上下文,沒有棧就沒有函數,沒有局部變量
 棧保存了一個函數調用所需的維護信息:
  函數參數,函數返回地址;局部變量;函數調用上下文
內存空間
堆:內存的動態申請和歸還
 堆是程序中一塊巨大的內存空間,可由程序自由使用
 堆中被程序申請使用的內存在程序主動釋放前將一直有效
 系統對堆空間的管理方式:空閒鏈表法,位圖法,對象池法等等
內存空間
靜態存儲區:保存全局變量和靜態變量
 程序靜態存儲區隨着程序的運行而分配空間,直到程序運行結束
  在程序的編譯期靜態存儲區的大小就已經確定
  程序的靜態存儲區主要用於保存程序中的全局變量和靜態變量
  與棧和堆不同,靜態存儲區的信息最終會保存到可執行程序中

3.程序的內存佈局

代碼在可執行程序中的對應關係
內存空間
文件佈局在內存中映射
內存空間
各個段的作用
 堆棧段在程序運行後才正式存在,是程序運行的基礎
 .bss段存放的是未初始化的全局變量和靜態變量
 .text段存放的是程序中的可執行代碼
 .data段保存的是那些已經初始化了的全局變量和靜態變量
 .rodata段存放程序中的常量值,如字符串常量

程序術語對應關係
 靜態存儲區通常指程序中的.bss和.data段
 只讀區通常指程序中的.rodata段
 局部變量所佔空間爲棧上空間
 動態空間爲堆中的空間
 程序可執行代碼存放於.text段

4.野指針和內存操作分析

野指針
 野指針通常是因爲指針變量中保存的值不是一個合法的內存地址而造成的
  野指針不是NULL指針,是指向不可用內存的指針
  NULL指針不容易用錯,因爲if語句很好判斷一個指針是不是NULL
野指針的由來
 局部指針變量沒有被初始化
  使用已經釋放過後的指針
  指針所指向的變量在指針之前被銷燬
非法內存操作
 結構體成員指針未初始化;沒有爲結構體指針分配足夠的內存
 內存分配成功,但並未初始化
 數組越界
 內存泄露
 多次指針釋放
 使用已釋放的指針
C語言中的規則
 用malloc申請了內存之後,應該立即檢查指針值是否爲NULL,防止使用值爲NULL的指針
 牢記數組的長度,防止數組越界操作,考慮使用柔性數組
 動態申請操作必須和釋放操作匹配,防止內存泄露和多次釋放
 free指針之後必須立即賦值爲NULL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章