首先,常量和全域性變數以及靜態變數都儲存於靜態儲存區,而區域性變數在棧區;
其次,記憶體分配方式有三種:
(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)
{p = malloc[num];
void test(void)
{
char *str = null;
getmemory(str, 100); // str 仍然為 null
strcpy(str, "hello"); // 執行錯誤
free(str);
=>此例中將指標str作為實參傳給形參p,表示讓指標p指向指標str所指向的位址空間。在函式getmemory中為指標p新申請一塊記憶體,其結果是讓指標p指向新申請的記憶體位址,而這個做法並不改變指標str的指向,因此test函式中執行完getmemory之後str仍然為null。
這就如同下邊的函式:
void getmemory(char *p, int num)
//進入這個函式後形參p指向實參位址
char a = 9;
p = &a; //此處將p指向變數a的位址
五,上述四中的例子不能申請記憶體,如果非要用指標申請記憶體可用指向指標的指標,或者三中的指標函式也行。
void getmemory2(char **p, int num)
//*p = new char[num];
*p = (char *)malloc(num);
void test2(void)
char *str = null;
getmemory2(&str, 100); // 注意引數是 &str,而不是str
strcpy(str, "hello");
//cout<< str << endl;
printf("str:%s\n", str):
free(str);
關於返回指標以及動態申請記憶體
首先,常量和全域性變數以及靜態變數都儲存於靜態儲存區,而區域性變數在棧區 其次,記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建...
關於返回指標以及動態申請記憶體
首先,常量和全域性變數以及靜態變數都儲存於靜態儲存區,而區域性變數在棧區 其次,記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建...
記憶體與指標 動態申請記憶體
1 malloc 標頭檔案malloc.h 一維記憶體申請 型別識別符號 變數 變數名 型別識別符號 malloc sizeof 型別識別符號 陣列大小 二維記憶體申請 型別識別符號 變數 變數名 型別識別符號 malloc sizeof 型別識別符號 陣列行大小 for int i 0 i 陣列行...