2011-09-17 70 views
1

當我們運行這段代碼,它工作正常,並打印string constant在屏幕上:在這種情況下,char []和char *的區別是什麼?

char *someFun(){ 
    char *temp = "string constant"; 
    return temp; 
} 
int main(){ 
    puts(someFun()); 
} 

但是,當我們運行下面類似的代碼,它不會工作,並在屏幕上打印一些垃圾:

char *someFun1(){ 
    char temp[ ] = "string"; 
    return temp; 
} 
int main(){ 
    puts(someFun1()); 
} 

背後是什麼原因呢?實質上,這兩個函數都做類似的事情(即返回一個「字符串」),但它們的行爲仍然不同。這是爲什麼?

回答

5
char *temp = "string constant"; 

string constant文字位於只讀段。它在程序終止時被釋放。所以,你可以有一個參考指向它。

char temp[ ] = "string"; 

string被複制到temp駐留上堆疊。隨着函數返回,堆棧的展開開始,它將取消分配函數範圍中的變量。但是你正在返回一個對它不再存在的引用,因此你得到了垃圾。但有時你可能仍然會得到正確的結果,但你不應該依賴它。

+1

參數,控制像'放返回地址和幀指針,和本地變量信息()'可以是使用先前使用的局部變量(數組)在'someFun1()的空間'。 –

+2

順帶處理字符串文字時避免出現問題,你應該指針存儲到他們裏面'爲const char *'變量,所以編譯器會阻止你,如果你嘗試修改它們。 –

3

在第一種情況時,指針temp將指向一個全局常量存儲"string constant"。因此,當你返回指針時,它是有效的。

在第二種情況下,「‘串’」僅僅是堆棧上的字符數組 - 你從函數返回後死亡。

+0

爲什麼在第一種情況下它存儲在全局堆,並在第二種情況下在本地棧? – buch11

+2

默認情況下,字符串文字全局存儲。 (不是在堆上,而是在程序存儲器中)。但是,當你聲明char []時,你可以把一個字符串作爲'{'s','t','r'的簡寫形式, 'I', 'N', 'G'}'。 – Mysticial

+0

...包括空終止符。 –