2013-09-22 171 views
-5

我試圖理解爲什麼這個工程:替換字符

char myst1r[] = "hello\n"; 
memmove(myst1r , myst1r + 1 , 1);//results in "eello" 

,而這一個:

char *mystr = "hello\n"; 
memmove(mystr , mystr + 1 , 1); 

導致「訪問衝突寫入位置」錯誤。 既不myst1rmystr指向字符緩衝區的第一個成員?我在這裏錯過什麼?

+0

請解釋你爲什麼downvote?這是完全有效的SO問題。 –

+2

@MichaelV這是一個重複很多次,它已被超過。 Downvoters大概有這樣的感覺,你沒有在詢問之前進行任何研究。另外,對數組和指針(特別是字符串常量)之間的區別理解最少的人不必問這個問題。 – 2013-09-22 13:35:50

+0

它被問到與char數組一起確實很清楚......在我的例子中,我試圖使用char指針。 –

回答

4

myst1r陣列的char其保持複製其初始化的mystr指針char指向它的初始值設定項。在這兩種情況下,初始化器都是一個文字字符串。區別在於您可以修改數組的內容,但不能修改文字字符串的內容。

+0

這意味着我不能用memmove來修改字符緩衝區指針嗎? –

+1

不,這不是什麼意思。你不能做的是**修改字符串字符串**。字符串字面值是帶引號的字符串:'「hello \ n「'例如,如果你有一個指向可修改文本的指針,你可以使用'memmove' –

+0

另外,錯誤代碼」寫入位置的訪問衝突「是有道理的,因爲編譯器將字符串放入只讀段 –

2
h e l l o \0 
0 1 2 3 4 5 

代碼

memmove(myst1r, myst1r + 1, 1) 

副本在位置1(e)放置0。結果在eello的字符。

至於第二實例

char *mystr = "hello\n"; 

mystr這裏是字符串文字,修改它會導致不確定的行爲在C和C++。

請注意,使用memcpy替換memmove將不起作用,因爲前兩個參數重疊。