我試圖理解爲什麼這個工程:替換字符
char myst1r[] = "hello\n";
memmove(myst1r , myst1r + 1 , 1);//results in "eello"
,而這一個:
char *mystr = "hello\n";
memmove(mystr , mystr + 1 , 1);
導致「訪問衝突寫入位置」錯誤。 既不myst1r
和mystr
指向字符緩衝區的第一個成員?我在這裏錯過什麼?
我試圖理解爲什麼這個工程:替換字符
char myst1r[] = "hello\n";
memmove(myst1r , myst1r + 1 , 1);//results in "eello"
,而這一個:
char *mystr = "hello\n";
memmove(mystr , mystr + 1 , 1);
導致「訪問衝突寫入位置」錯誤。 既不myst1r
和mystr
指向字符緩衝區的第一個成員?我在這裏錯過什麼?
myst1r
爲陣列的char
其保持複製其初始化的。 mystr
是指針到char
指向它的初始值設定項。在這兩種情況下,初始化器都是一個文字字符串。區別在於您可以修改數組的內容,但不能修改文字字符串的內容。
這意味着我不能用memmove來修改字符緩衝區指針嗎? –
不,這不是什麼意思。你不能做的是**修改字符串字符串**。字符串字面值是帶引號的字符串:'「hello \ n「'例如,如果你有一個指向可修改文本的指針,你可以使用'memmove' –
另外,錯誤代碼」寫入位置的訪問衝突「是有道理的,因爲編譯器將字符串放入只讀段 –
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
將不起作用,因爲前兩個參數重疊。
請解釋你爲什麼downvote?這是完全有效的SO問題。 –
@MichaelV這是一個重複很多次,它已被超過。 Downvoters大概有這樣的感覺,你沒有在詢問之前進行任何研究。另外,對數組和指針(特別是字符串常量)之間的區別理解最少的人不必問這個問題。 – 2013-09-22 13:35:50
它被問到與char數組一起確實很清楚......在我的例子中,我試圖使用char指針。 –