C語言中一些關於記憶體四區的歸納

weixin_33924312發表於2017-09-23

C語言中一些關於記憶體四區的歸納

博文參考傳送門

一、綜述

C語言程式中,程式碼是放在記憶體中執行的,我們大致將程式所佔用的記憶體分為四個區域:

  • 棧區 堆區 資料區 程式碼區

每個程式都有唯一一個記憶體四區,我們應該掌握各個區域的特性,例如儲存哪種型別的資料,由誰去申請開闢,又由誰去管理釋放等等。

二、記憶體四區介紹

1. 棧區

由編譯器自動分配釋放,比如存放函式的引數值,區域性變數等。
例如:

void recive(int a,int b) {
    int c;
}

其中,引數a,引數b和變數c都是存放在棧區,當函式執行完畢的時候,它們佔有的空間自動釋放。

2. 堆區

一般由程式設計師分配釋放(如動態記憶體申請<malloc函式>),若程式設計師不釋放,程式結束時可能由作業系統回收。
例如:

char *src;
src = (char*)malloc(4 *sizeof(char));//動態分配記憶體,表示查詢可用的連續4個位元組記憶體的空間,並將該記憶體首地址強制轉換為指向字元資料的指標賦給scr,為src這個指標變數分配4個char型別的空間。
3.資料區

分為兩種:1、常量區:存放常量,一般是字串常量。
2、全域性區(靜態區):存放全域性變數和靜態變數。
該區域是在程式結束後由作業系統釋放。

4.程式程式碼區

這個區域存放函式體的二進位制程式碼,也是由作業系統進行管理。

三、劃分記憶體四區的意義

C語言程式中,根據是區域性變數,全域性變數,常量還是其他,通過malloc等類似的函式分配記憶體空間,把他們放到對應的記憶體區中,這樣就賦予了這些變數或常量不同的生命週期。
根據我們程式的需要,我們在編寫程式碼過程中,宣告不同的變數型別,使他們有不同的宣告長度,不同的釋放方式,可以讓我們更加靈活地程式設計。

四、記憶體四區的一個例項

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

int main()
{
    int i;
    char* p1[3]= {"abc","def","ghi"};
    char p2[3][4]= {"123","456","789"};
    char** p3= (char**)malloc( 3 * sizeof(char*));
    for(i=0;i < 3;i++)
    {
        p3[i]= (char *)malloc ( 5 * sizeof(char));
        sprintf(p3[i],"%d%d%d",i,i,i);  
        /*
        sprintf()函式:最常見的應用之一是把整數列印到字串中
        例如:
        srpintf(s,"%d",123);
        輸出為:"123"
        輸出結果不會列印在螢幕上,而是寫入字串中
        */
        printf("%s\n",p3[i]);
        /*
        printf()函式才將結果輸出到螢幕上
        */
    }
    free(p3);
    return 0;
}

示例程式碼圖示:

2282619-c0793492040ba8ac.PNG
示例程式碼圖示

相關文章