char str[]和char *str的區別


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM