我试图理解为什么会这样:
char myst1r[] = "hello\n";
memmove(myst1r , myst1r + 1 , 1 );//results in "eello"
而这一个:
char *mystr = "hello\n";
memmove(mystr , mystr + 1 , 1 );
导致“访问冲突写入位置”错误。
myst1r
和mystr
都不指向char缓冲区的第一个成员?我在这里想念什么?
答案 0 :(得分:4)
myst1r
是char
的数组,其中包含初始值设定项的副本。 mystr
是{strong>指针指向char
,指向其初始值设定项。在这两种情况下,初始化程序都是文字字符串。区别在于您可以修改数组的内容,但不能修改文字字符串的内容。
答案 1 :(得分: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
将无效,因为前两个参数重叠。