char str[]和char *str的區別

一、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在棧裏面的空間。。

相關文章
相關標籤/搜索