我有这个自定义字符串复制函数,我注意到 *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 将目标字符串的原始内容减去更改的字符数(4 表示“再见”)移动到新地址并将其分配给 *dest
。
这是真的吗?有人可以向我解释为什么吗?
这与工作无关,我只是想更好地理解指针的行为方式。
非常感谢您的回复!
最佳答案
问题出在这里
while (*dest++ = *src++)
;
这在简单的英语中意味着将 src 指向的东西复制到 dest 指向的东西,然后递增 src 和 dest(即,将两个指针都指向下一个东西)。
如果您想避免更改指针,请使用指针的副本 - 例如,您已经创建的 a 变量,然后返回该变量。
关于c - 在 C 中,为什么当我修改其内容时我的指针参数会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12934784/