2013-09-22 232 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将不起作用,因为前两个参数重叠。