一、http://blog.csdn.net/szchtx/article/details/10396149數組
char ss[]="C++"; 函數
ss[0]='c'; // 合法.net
char *p="C++"; 指針
p[0]='c'; // 合法但不正確對象
該段代碼在VS2010下編譯能夠經過,可是運行時程序會中止工做,爲何呢?緣由在於p[0]='c'這一語句。該語句試圖修改p指向的字符串的首個字符,出現了錯誤。blog
緣由在於兩種方式對字符數組操做的機制不一樣。使用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指向的是常量,故內容不能改變。get
二、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在棧裏面的空間。。