在字符指针中用内存移动替换字符



我试图理解为什么会这样:

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

而这个:

char *mystr = "hellon";
memmove(mystr , mystr + 1 , 1 );

导致"访问冲突写入位置"错误。myst1rmystr不是都指向 char 缓冲区的第一个成员吗?我在这里错过了什么?

> myst1r 是一个char数组,其中包含其初始值设定项的副本mystr 是指向char指针,指向其初始值设定项。在这两种情况下,初始值设定项都是文本字符串。不同之处在于,您可以修改数组的内容,但不能修改文本字符串的内容。

h e l l o 
0 1 2 3 4 5

代码

memmove(myst1r, myst1r + 1, 1 )

将位置 1 (e) 处的字符复制到位置 0。结果eello .

至于第二个例子

char *mystr = "hellon";

mystr这里是字符串文字,修改它会导致 C 和 C++ 中的行为未定义。

只是一点说明,使用 memcpy 替换memmove将不起作用,因为前两个参数重叠。

最新更新