內核空間和用戶空間:html
咱們在編寫程序時使用的內存空間叫虛擬內存,程序在運行時,要完成虛擬內存到物理內存的轉換。假如在32位環境上,理論上咱們能夠使用的虛擬內存空間是4GB,但實際上這4GB並不能徹底給咱們使用,有一部份內存是固定分配給操做系統內核的,分配給操做系統的這部份內存咱們叫它內核空間,除去內核空間之後用戶能使用的內存叫用戶空間,在linux 32環境下,高地址的1GB是固定給內核使用的,低地址的3GB纔是給用戶使用的。linux
用戶空間內存分配狀況:程序員
各個內存分區的說明:數據結構
內存分區 | 說明 |
---|---|
程序代碼區 (code) |
存放函數體的二進制代碼。一個C語言程序由多個函數構成,C語言程序的執行就是函數之間的相互調用。 |
常量區 (constant) |
存放通常的常量、字符串常量等。這塊內存只有讀取權限,沒有寫入權限,所以它們的值在程序運行期間不能改變。 |
全局數據區 (global data) |
存放全局變量、靜態變量等。這塊內存有讀寫權限,所以它們的值在程序運行期間能夠任意改變。 |
堆區 (heap) |
通常由程序員分配和釋放,若程序員不釋放,程序運行結束時由操做系統回收。malloc()、calloc()、free() 等函數操做的就是這塊內存,這也是本章要講解的重點。 注意:這裏所說的堆區與數據結構中的堆不是一個概念,堆區的分配方式卻是相似於鏈表。 |
動態連接庫 | 用於在程序運行期間加載和卸載動態連接庫。 |
棧區 (stack) |
存放函數的參數值、局部變量的值等,其操做方式相似於數據結構中的棧。 |
舉例:函數
#include <stdio.h> char *str1 = "hello world"; //字符串在常量區,str1在全局數據區 int n; //全局數據區 char* func(){ char *str = "hello world"; //字符串在常量區,str在棧區 return str; } int main(){ int a; //棧區 char *str2 = "01234"; //字符串在常量區,str2在棧區 char arr[20] = "56789"; //字符串和arr都在棧區 char *pstr = func(); //棧區 int b; //棧區 return 0; }