我有这个自定义字符串复制功能,我注意到*dest
参数在解除引用并修改其内容后会发生变化:
char *copyArray(char *dest, char *src)
{
char *a = dest;
while (*dest++ = *src++)
;
char *b = dest;
if ( (a-b) != 0)
printf("Dest pointer has changed\n");
return dest;
}
如果您考虑以下代码:
int main()
{
char name [] = "Hello, there!";
char *new = copyArray(name, "bye");
printf("New is '%s', name is '%s'\n", new, name);
return 0;
}
我得到以下输出:
Dest pointer has changed
New is 'o, there!', name is 'bye'
为什么会这样?
我的意图是*new
指向同一位置name[]
,但显然地址发生了变化,它指向不同的位置。
我觉得发生的事情是,一旦复制结束,C将目标字符串的原始内容减去更改的字符数(“bye”为4)转移到新地址并将其分配给*dest
。
这是真的发生了什么?有人可以向我解释一下原因吗?
这与工作无关,我只是想更好地理解指针的行为。
非常感谢您的回复!
答案 0 :(得分:4)
问题出现在这里
while (*dest++ = *src++)
;
以简单的英语表示将src指向的东西复制到dest指向的东西,然后在src和dest之后增加(即,将两个指针前进指向下一个东西)。
如果你想避免更改它,请使用指针的副本 - 例如你已经创建的变量,然后返回该变量。
答案 1 :(得分:4)
参数dest
正在增加(在while
条件下)四次(因为"bye"
是4个字符,包括将在{{的最后一次迭代时分配的空值1}})在函数while
内,然后返回其值,以便copyArray()
指向new
。
让name + 4
指向new
的{{1}}的{{1}}开头{/ 1}}。