1. 程式人生 > >C++解析char *p與char p[]

C++解析char *p與char p[]

首先來看一道題目:

#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函式退出時,該該字串常量所在記憶體不會被回收,故能夠通過指標順利無誤的訪問。