關於返回指標以及動態申請記憶體

2021-07-04 09:11:49 字數 1307 閱讀 7595

首先,常量和全域性變數以及靜態變數都儲存於靜態儲存區,而區域性變數在棧區; 

其次,記憶體分配方式有三種: 

(1)從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。 

(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。 

(3)   從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

一,char   *getmemory() 

int   main() 

=>上述結果可輸出hello,因為p指標指向的「hello」是字串常量,生存期為整個程式執行階段。返回指標p給指標str等於將str指向「hello」的首位址,雖然getmemory返回時指標p被釋放,但處於靜態儲存區的字串常量沒有變化,因此可輸出hello。

二,char *getmemory()

int   main() 

=>上述結果輸出亂碼,原因是指標p指向的位址為區域性陣列a的首位址,返回指標p給指標str等於將str指向a的首位址,當getmemory返回時指標p和陣列a都被釋放,因此輸出為亂碼。

三,char   *getmemory() 

int   main()

=>上述結果輸出hello,因為getmemory中用到動態申請記憶體,由malloc申請的記憶體屬於從堆上分配,其生存期由我們決定,且讓指標p指向動態申請的這塊記憶體首位址。當getmemory返回時指標p和陣列a都被釋放,但在堆上的這塊記憶體沒變化(儲存著hello這個字串),因此可輸出hello。

四,關於指標的傳遞上述兩個函式中,getmemory返回指標p給str,意思是讓str指向指標p所指向的位址空間。又如 void getmemory(char *p, int num)

void test(void)=>此例中將指標str作為實參傳給形參p,表示讓指標p指向指標str所指向的位址空間。在函式getmemory中為指標p新申請一塊記憶體,其結果是讓指標p指向新申請的記憶體位址,而這個做法並不改變指標str的指向,因此test函式中執行完getmemory之後str仍然為null。這就如同下邊的函式void getmemory(char *p, int num)

五,上述四中的例子不能申請記憶體,如果非要用指標申請記憶體可用指向指標的指標,或者三中的指標函式也行。void getmemory2(char **p, int num)void test2(void)

關於返回指標以及動態申請記憶體

首先,常量和全域性變數以及靜態變數都儲存於靜態儲存區,而區域性變數在棧區 其次,記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建...

返回指標的函式及動態申請記憶體

首先,常量和全域性變數以及靜態變數都儲存於靜態儲存區,而區域性變數在棧區 其次,記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建...

記憶體與指標 動態申請記憶體

1 malloc 標頭檔案malloc.h 一維記憶體申請 型別識別符號 變數 變數名 型別識別符號 malloc sizeof 型別識別符號 陣列大小 二維記憶體申請 型別識別符號 變數 變數名 型別識別符號 malloc sizeof 型別識別符號 陣列行大小 for int i 0 i 陣列行...