在C中,为什么我的指针参数在修改其内容时会发生变化?

时间:2012-10-17 12:53:29

标签: c pointers

我有这个自定义字符串复制功能,我注意到*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

这是真的发生了什么?有人可以向我解释一下原因吗?

这与工作无关,我只是想更好地理解指针的行为。

非常感谢您的回复!

2 个答案:

答案 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}}。