linux下C/C++程序的內存佈局

內核空間和用戶空間: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; }
相關文章
相關標籤/搜索