在程序員面試寶典上看到這個兩句話:
1、char c[]="hello world"是分配一個局部數組;
2、char *c="hello world"是分配一個全局數組;
最開始還以爲是書上說錯了,因爲自己的理解是這兩種方式是等效的。下來查了一下才知道這兩種方式的區別。
char* str="hello world ";這個指針指向常量字符串,存儲在靜態存儲區,是隻讀的,不能被修改。而char str[]="hello world"是一個局部變量數組,存儲在棧上的內存空間,可以被修改。
拿程序員面試寶典上的例子來說:
<span style="font-size:18px;">char* strA()
{
char* str = "hello world";
return str;
}
char* strB()
{
char str[] = "hello world";
return str;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = strA();
cout << str << endl;
char* str2 = strB();
cout << str2 << endl;
return 0;
}</span>
上述代碼的輸出結果爲:
從圖中可以看到,在主函數中strA函數,可以正常的輸出"hello world"。
而調用strB時,輸出則是亂碼。
原因在於char* str = "hello world"中定義的str是存儲在靜態存儲區中,具有全局屬性,
所以函數結束時,能夠正常返回指向存有hello world的內存單元,
而char str[] = "hello world"中的str是存儲在棧上的局部變量數組,但函數運行結束時,
會清空棧的存儲空間,因此,str2將指向無效的地址空間。因此是亂碼。