char str 和char str的區別

2021-09-06 18:10:02 字數 1205 閱讀 2092

1、

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、

錯誤寫法:

char* get_str(void) 

char str = ; 

return str; 

正確寫法:

char* get_str(void) 

char *str = ; 

return str; 

char str = ;定義了乙個區域性字元陣列,儘管是陣列,但它是乙個區域性變數,返回它的位址肯定是乙個已經釋放了的空間的位址。

此函式返回的是內部乙個區域性字元陣列str的位址,且函式呼叫完畢後 此陣列被銷毀,所以你返回的指標也就指向一塊被銷毀的記憶體,這種寫法是錯誤的。

char* str = ;表示先定義個字串常量,並將其位址賦給str。

此函式返回的是字串常量的位址,而像這種字串都是屬於全域性的,在編譯的時候就已經分配了記憶體了,只有程式退出的時候才會被銷毀,所以返回它的位址是沒有問題的,但是你最好返回常量指標,因為你不能去改變字串常量的值。

這個str就在棧裡面,但後面的字串在常量區,函式返回的時候,先將常量區的位址返回,然後作用域結束,釋放str在棧裡面的空間。。

char str和char str 的區別

我在vs2008平台上編寫例程如下 viewcode 1 include stdafx.h 2 include 34 char reverse char str 5 11 char lastdata str len 1 保留最後乙個字元 12 str len 1 0 13 reverse str 1...

char str和char str 的區別

真是慚愧,都要上大四了才來補這個知識點。之前只學了c的時候字元陣列就是一塌糊塗,還沒搞懂的時候學了c 後來基本都是用的string,沒有用過char 今天又碰到了這個問題,一定要把他弄懂!事情的起因是我給乙個char str賦了初值,後來又嘗試改變它,但程式一直崩潰找不到原因,最難受的是編譯不會報錯...

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...