C++解析char *p與char p[]
阿新 • • 發佈:2019-02-07
首先來看一道題目:
#include "stdio.h"
char *get_string_1()
{
char p[] = "hello world!";
return p;
}
char *get_string_2()
{
char *p = "hello world!";
return p;
}
int main()
{
char *p;
p = get_string_1();
printf("get_string_1:%s\n",p);
p = get_string_2();
printf("get_string_2:%s \n",p);
return 0;
}
輸出:
get_string_1:(亂碼或者沒有輸出),linux下沒有任何輸出
get_string_2:hello world!
為什麼會這樣?
1.”hello world”是一個字串常量,存放在靜態資料區,沒錯,但是把一個字串常量賦值給了一個區域性變數,該變數存放在棧中。
這樣就有兩塊內容一樣得記憶體,也就是說“char p[]=”hello world!”;這條語句讓“hello world!”這個字串在記憶體中有兩份拷貝,一份在動態分配的棧中,另一份在靜態儲存區。
當get_string_1函式退出得時候,棧要清空,區域性變數記憶體也被清空了,所以這個時候函式返回得是一個已經釋放了得記憶體地址。
2.因為”hello world!”是一個字串常量,存放在靜態資料區,把該字串常量存放的靜態資料區的首地址賦值給了指標。所以get_string_2函式退出時,該該字串常量所在記憶體不會被回收,故能夠通過指標順利無誤的訪問。