1、http://blog.csdn.net/szchtx/article/details/10396149
char ss[]="C++";
ss[0]='c'; // 合法
char *p="C++";
p[0]='c'; // 合法但不正確
該段程式碼在VS2010下編譯可以通過,但是執行時程式會停止工作,為什麼呢?原因在於p[0]='c'這一語句。該語句試圖修改p指向的字串的首個字元,出現了錯誤。
原因在於兩種方式對字元陣列操作的機制不同。使用char *p="C++"語句後,編譯器在記憶體的文字常量區分配一塊記憶體,儲存”C++“這一字串字面值,然後在棧上分配記憶體儲存p,p的內容為"C++"的地址。p[0]='c'試圖修改常量”C++“,程式當然就會崩潰了。而char ss[]="C++"語句,定義了一個陣列,編譯器為其在棧上分配了記憶體空間,因而可以進行修改操作。
因此,可以總結如下:
(1)char ss[]定義了一個陣列,ss可認為是一個常指標,ss不可改變,但ss指向的內容可以發生改變。
(2)char *p定義了一個可變指標,p可以指向其它物件。但對於char *p=”abc“這樣的情況,p指向的是常量,故內容不能改變。
2、http://blog.csdn.net/hackbuteer1/article/details/6706562
錯誤寫法:
char* get_str(void)
{
char str[] = {"abcd"};
return str;
}
正確寫法:
char* get_str(void)
{
char *str = {"abcd"};
return str;
}
char str[] = {"abcd"};定義了一個區域性字元陣列,儘管是陣列,但它是一個區域性變數,返回它的地址肯定是一個已經釋放了的空間的地址。
此函式返回的是內部一個區域性字元陣列str的地址,且函式呼叫完畢後 此陣列被銷燬,所以你返回的指標也就指向一塊被銷燬的記憶體,這種寫法是錯誤的。
char* str = {"abcd"};表示先定義個字串常量,並將其地址賦給str。
此函式返回的是字串常量的地址,而像這種字串都是屬於全域性的,在編譯的時候就已經分配了記憶體了,只有程式退出的時候才會被銷燬,所以返回它的地址是沒有問題的,但是你最好返回常量指標,因為你不能去改變字串常量的值。
這個str就在棧裡面,但後面的字串在常量區,函式返回的時候,先將常量區的地址返回,然後作用域結束,釋放str在棧裡面的空間。。