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在棧里面的空間。。