char str[]和char *str的區別

weixin_34391854發表於2014-09-15

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

相關文章