我试图理解为什么这个工程:替换字符
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[] = "hello\n";
memmove(myst1r , myst1r + 1 , 1);//results in "eello"
,而这一个:
char *mystr = "hello\n";
memmove(mystr , mystr + 1 , 1);
导致“访问冲突写入位置”错误。 既不myst1r
和mystr
指向字符缓冲区的第一个成员?我在这里错过什么?
myst1r
为阵列的char
其保持复制其初始化的。 mystr
是指针到char
指向它的初始值设定项。在这两种情况下,初始化器都是一个文字字符串。区别在于您可以修改数组的内容,但不能修改文字字符串的内容。
这意味着我不能用memmove来修改字符缓冲区指针吗? –
不,这不是什么意思。你不能做的是**修改字符串字符串**。字符串字面值是带引号的字符串:'“hello \ n“'例如,如果你有一个指向可修改文本的指针,你可以使用'memmove' –
另外,错误代码”写入位置的访问冲突“是有道理的,因为编译器将字符串放入只读段 –
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
将不起作用,因为前两个参数重叠。
请解释你为什么downvote?这是完全有效的SO问题。 –
@MichaelV这是一个重复很多次,它已被超过。 Downvoters大概有这样的感觉,你没有在询问之前进行任何研究。另外,对数组和指针(特别是字符串常量)之间的区别理解最少的人不必问这个问题。 – 2013-09-22 13:35:50
它被问到与char数组一起确实很清楚......在我的例子中,我试图使用char指针。 –