我试图理解为什么会这样:
char myst1r[] = "hellon";
memmove(myst1r , myst1r + 1 , 1 );//results in "eello"
而这个:
char *mystr = "hellon";
memmove(mystr , mystr + 1 , 1 );
导致"访问冲突写入位置"错误。myst1r
和mystr
不是都指向 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
将不起作用,因为前两个参数重叠。