char str[]和char *str的區別

來源:互聯網
上載者:User

標籤:blog   http   使用   ar   art   問題   代碼   log   c   

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

char str[]和char *str的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.