1. 程式人生 > >字串常量和指標的理解

字串常量和指標的理解

字串常量和字元陣列

2018年05月04日 10:03:22 靖_harry 閱讀數:193更多

個人分類: C/C++

據C語言記憶體模型,字串常量應該被放在程式碼區(也有書上稱作資料區,是隻讀不可寫的(所以說字串常量不可修改)。下面兩個函式分別返回hello和world兩個字串,但卻只有一個能達到預期效果: 
這裡寫圖片描述 
輸出結果: 
這裡寫圖片描述

可以看到,結果只輸出了hello,並且編譯時報了一個warning,意思是第二個函式返回的是區域性變數的地址。從這個warning的資訊中可以看出問題所在。下面分析兩個函式: 
1. 函式getString_1() 
先是生成一個字串常量“hello”,這個字串應該存放在程式碼區

然後指標str1儲存了“hello”在程式碼區的地址因此返回的內容是程式碼區的某個地址。 當讀取這個地址時就獲得了這個字串。
2. 函式getString_2() 
先是生成一個字串常量“world”,這個字元串存放在程式碼區。然後又在棧中生成一個字元陣列str2,其中char str2[10] = “world”這一句的背後是將程式碼區的字串常量“world”拷貝了一份填充到棧區str2陣列中,陣列名str2就代表是陣列的首地址。因此返回的內容是中str2陣列的地址。而當函式呼叫完畢(printf函式執行到getstring_2()後即沒有執行完該函式中的全部程式碼只要函式getstring_2()執行完,它對應的棧就立即銷燬),棧中內容自動銷燬
getstring_2()對應的棧銷燬後,儲存在棧上的陣列str2的地址也就不存在了,於是也就找不到程式碼區上“world”的對應地址了。所以得不到字串“world”。而程式碼區中的字串“world”由於沒有它的地址,因此也無法訪問。