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