C語言 內存四大存儲區域


#include<stdio.h>
#include<stdlib.h>

//程序代碼指令,define定義的常量---代碼區(只讀)
//全局(關鍵)變量/常量,靜態(關鍵)變量/常量,常量字符串---靜態區
//靜態區的內容在總個程序的生命周期內都存在,由編譯器在編譯的時候分配。
//局部變量---棧區
//棧區上的內容只在函數的范圍內存在,當函數運行結束,這些內容也會自動被銷毀。其特點是效率高,但空間大小有限。
//由malloc或者realoc,calloc分配的內存區域---堆區
//堆區其生命周期由free決定。


#define PI 3.14   //

//全局變量
int a = 10;
int b[5] = { 1, 2, 3, 4, 5 };
int const c = 2;

void run2();

void main(){
    int num = 10;
    //對於int num = 10;的理解
    //int 數據類型 編譯器預算對象(變量)num分配4個字節內存空間大小
    //num是內存中一段內存空間的標識(相當於門牌號),
    //10 才是存儲在這段內存空間里的數據
    //詳細的來說,“int num=10;”這段字符存儲在代碼區,數據10存儲在棧區

    //驗證局部常量是否存儲在棧區
    run2();
    //經過內存觀察,開始局部常量cde的內存空間的數據是2
    //當run2()函數執行完畢,局部常量cde的內存空間的數據發生變化
    //因為靜態區的內容在總個程序的生命周期內都存在,所以判斷局部常量存儲在棧區


    char *p = "asdfadsf";//"asdfadsf"是字符串常量,在靜態區,只讀
    //指針p是臨時變量,在棧區
    //驗證 "asdfadsf" 只讀
    //*p = 'a';//編譯不報錯
    printf("%s\n", p);//運行報錯--“寫入位置 0x001B692C 時發生訪問沖突。”,由此證明"asdfadsf"是字符串常量,只讀

    //堆只能是malloc或者realoc,calloc,分配的內存才是堆
    //例如以下代碼
    void *p1 = malloc(sizeof(int)* 1024);//malloc(sizeof(int)* 1024);分配的內存就是堆區,但是指針p1是在棧區
    //堆的使用情況:①無法確定需要內存的大小;②需要的內存很大
    //堆的注意點:堆和棧不同,堆的內存大小是由程序員分配的,必須由程序員手動釋放(free(p1););
    //對於棧來說,棧的內存大小由系統分配(棧的極限大約是1M,非常小),所以棧的內存空間是由系統回收的

    //堆的內存大小是由程序員分配的,理論上可以占據系統中所有的內存(甚至能搶占棧的內存空間)
    //因為棧的內存空間是由系統回收的,所有在回收的時候會消耗大量的cpu
    char d = 'a';//變量d的數據在棧區中

    system("pause");
}

//run1是程序代碼,所以存儲在代碼區
void run1(){
    while (1){
        int x = 0;//x變量的內存空間在棧區,因為while循環,x每次循環都會初始化,所以系統不斷的在棧上創建x的內存空間,回收x的內存空間,會消耗大量的cpu
        printf("%d", x);
    }
}

void run2(){
    const cde = 2;//變量cde的數據在棧區,與cde是否是常量沒關系
    printf("%x\n",&cde);//獲取cde的地址,檢測run2()函數在main()執行完成之后,系統是否會回收cde指向的內存空間
}

int add(int a, int b){//形參a,b是臨時變量,形參a,b的數據存儲在棧區
    return a + b;//a+b的操作會在寄存器中執行
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM