C++ char* str與char str[]

在程序員面試寶典上看到這個兩句話:

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將指向無效的地址空間。因此是亂碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章