中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

C之程序中的三國天下(三十五)-創新互聯

    今天我們來探討下 C 語言中的數據存儲方式。在程序中,數據的存儲方式無外乎分為棧、堆以及靜態存儲區。我們分別來看看這三種方式,看看有何區別。

創新互聯是一家專注于成都網站建設、成都網站設計與策劃設計,科爾沁左翼網站建設哪家好?創新互聯做網站,專注于網站建設10年,網設計領域的專業建站公司;建站業務涵蓋:科爾沁左翼等地區。科爾沁左翼做網站價格咨詢:028-86922220

        A、程序中的棧

        棧是現代計算機程序里最為重要的概念之一,棧是用于維護函數調用上下文,同樣函數中的參數和局部變量存儲在棧上。棧保存了一個函數調用所需的維護信息,如下圖所示

C之程序中的三國天下(三十五)

        那么每次函數調用都對應著一個棧上的活動記錄:a> 調用函數的活動記錄位于棧的中部;b> 被調函數的活動記錄位于棧的頂部。

C之程序中的三國天下(三十五)

        從 main() 開始運行,我們看到有兩個指針 ebp 和 esp。


C之程序中的三國天下(三十五)

        那么當 main() 調用 f() 時,ebp 就往前走四個字節,指向原來 esp 的位置。esp 也繼續向前走


C之程序中的三國天下(三十五)

        當從 f() 調用總返回 main() 時,ebp 和 esp 都向回退四個字節。


C之程序中的三國天下(三十五)

        那么我們看到函數調用時,對應的棧空間在函數返回前是專用的。當函數調用后棧空間將被釋放,數據不再有效。下圖更形象的表示了

C之程序中的三國天下(三十五)


        下來我們以代碼為例進行分析

#include <stdio.h>

int* g()
{
    int a[10] = {0};
    
    return a;
}

void f()
{
    int* pointer = g();
}

int main()
{
    f();
    
    return 0;
}

        我們看到在函數 g() 中定義了一個數組,但是我們返回了它的地址,也就是返回了局部數組的地址。在 f() 中調用了 g(),這樣肯定會出問題,我們來看看編譯結果C之程序中的三國天下(三十五)

        我們看到編譯器已經給出了警告,那么這么操作肯定是不安全的。

        B、程序中的堆

        那么什么是堆呢?堆是程序中一塊預留的內存空間,可由程序自由使用,堆中被程序申請使用的內存在被主動釋放前將一直有效。那么我們為什么有了棧還需要堆呢?棧上的數據在函數返回后就會被釋放掉,無法傳遞到函數外部,如:局部數組。那么堆則不一樣,如果我們不去主動釋放,它就一直有效,但是也就造成了一個問題,如果我們只申請不去釋放堆,到最后堆用完了程序便會崩潰。

        那么我們在程序中怎么來申請堆呢?在 C 語言程序中通過庫函數的調用來獲得堆空間。對應的頭文件是 malloc.h;malloc 是以字節的方式動態申請堆空間;free 是將堆空間歸還給系統。系統對堆空間的管理方式有這么幾種:空閑鏈表法、位圖法以及對象池法等。

        下圖是空閑鏈表管理法的示意圖C之程序中的三國天下(三十五)

        如果我們需要申請 4 字節的話,根據這個表來看,我們便會申請到跟它最匹配的,便是 5 字節了。所以有時我們申請的空間會比我們所需的大一點。

        C、程序中的靜態存儲區

        靜態存儲區是隨著程序的運行而分配空間,它的生命周期直到程序運行結束。在程序的編譯器靜態存儲區的大小就已經確定,主要用于保存全局變量和靜態局部變量,它保存的信息最終會保存到可執行程序中。

        下來我們以代碼為例來進行分析

#include <stdio.h>

int g_v = 1;

static int g_vs  = 2;

void f()
{
    static int g_vl = 3;
    
    printf("&g_vl = %p\n", &g_vl);
}

int main()
{
    printf("&g_v = %p\n", &g_v);
    
    printf("&g_vs = %p\n", &g_vs);
    
    f();
    
    return 0;
}

        我們看到分別定義了三個變量,第3行是 int 型的全局變量,第5行是加 static 修飾的 int 型變量,第9行是加 static 修飾的函數內的局部變量。我們分別來打印下三個變量的地址,看看他們有什么關系

C之程序中的三國天下(三十五)

        那么我們看到雖然他們三個類型不同,但是地址是連續的,也就證明他們三個是分布在同一個數據區的,便是靜態存儲區啦。通過本節對棧、堆以及靜態存儲區的學習,總結如下:1、棧區主要用于函數調用的使用;2、堆區主要是用于內存的動態申請和歸還;3、靜態存儲區用于保存全局變量和靜態變量。

        歡迎大家一起來學習 C 語言,可以加我QQ:243343083。

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文名稱:C之程序中的三國天下(三十五)-創新互聯
URL網址:http://m.2m8n56k.cn/article0/dhpsio.html

成都網站建設公司_創新互聯,為您提供自適應網站動態網站微信小程序App設計外貿建站品牌網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

營銷型網站建設
主站蜘蛛池模板: 美女拍拍拍爽爽爽爽爽爽 | 欧美亚洲欧美区 | 最新欧美精品一区二区三区 | 特黄a三级三级三级 | 精品国产品欧美日产在线 | 97一级毛片全部免费播放 | 99在线免费 | 九九99视频在线观看视频观看 | 色天使色婷婷在线影院亚洲 | 久热中文字幕在线精品免费 | 美女张开腿让男人操 | 亚洲国产激情 | 性夜黄a爽爽免费视频国产 性夜影院爽黄a爽免费看网站 | 男人天堂avav | 狠狠色丁香婷婷综合久久来 | 日本在线观看免费视频网址 | 久久亚洲精品成人综合 | 久草免费在线视频 | 成人免费在线网站 | 欧美日韩亚洲在线观看 | 正在播放的国产a一片 | 精品国产香蕉在线播出 | 久草手机在线观看视频 | 国产精品18久久久久久小说 | 国产一级二级三级毛片 | 毛片高清一区二区三区 | 中文字幕日韩精品亚洲七区 | 国产在线精品一区二区夜色 | 美女扒开腿让男人桶爽免费动态图 | 美女叉开腿让男人捅 | 欧美三级视频在线观看 | 国产在线手机视频 | 亚洲最大福利视频 | 亚洲码一区二区三区 | 国产成人精品视频频 | 一级毛片视频免费观看 | 在线不卡亚洲 | 黄色亚洲网站 | 成人网中文字幕色 | 成人黄网18免费观看的网站 | 天堂8中文在线 |