棧 堆 靜態記憶體分配的乙個例子

2021-06-16 05:21:42 字數 738 閱讀 5325

1、棧記憶體

看下面的例子:

//返回的是區域性變數的位址,該位址位於動態資料區,棧裡

char *getmemory( void )

void test( void )

這是乙個錯誤的程式,編譯時編譯器會給出警告:

warning c4172: returning address of local variable or temporary

造成錯誤的原因是p是在棧上分配的記憶體,當呼叫函式getmemory結束後,這個位址即被釋放,這時這個位址儲存的內容是未知的。

解決的乙個辦法就是在堆上或者靜態儲存區分配,所以有下面兩者解決辦法

2、堆記憶體分配

呼叫malloc分配即可,即

#include

char *getmemory( void )

或者可以在靜態儲存區分配記憶體,加上static關鍵字即可

3、靜態儲存區分配

//返回的是靜態區域性變數的位址,該位址位於靜態資料區

char *getmemory( void )

這裡再補充一種解決辦法,常量字串是位於記憶體的靜態儲存區的,所以這裡可以這樣修改:

4、定義指標,指向常量字串

//返回的是字串常量的位址,該位址位於靜態資料區

char *getmemory( void )

這裡的指標p是常量字串在靜態儲存區的位址,所以即使函式getmemory退出了,但是只要程式未結束,這個靜態儲存區仍然存在。

記憶體分配 靜態儲存區 棧 堆

一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式內區域性變數的儲存單元都可以在...

記憶體分配 靜態儲存區 棧 堆

一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式內區域性變數的儲存單元都可以在...

關於記憶體分配的幾個例子

1.include include include void getmemory char p void test int main void getmemory char p void test void 分析 在vs2010上編譯可以通過,但是不能執行。個人理解 執行getmemory 時,p是...