-5

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

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

而这个:

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

导致“访问冲突写入位置”错误。不要同时myst1r指向mystrchar 缓冲区的第一个成员?我在这里想念什么?

4

2 回答 2

4

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

于 2013-09-22T13:28:18.793 回答
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将不起作用,因为前两个参数重叠。

于 2013-09-22T13:32:11.247 回答