1

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

这是真的发生了吗?有人可以向我解释为什么吗?

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

非常感谢您的回复!

4

2 回答 2

4

问题出现在这里

while (*dest++ = *src++)
    ;   

用简单的英语表示,将 src 指向的东西复制到 dest 指向的东西中,然后增加 src 和 dest (也就是说,将两个指针都前进到指向下一个东西)。

如果您想避免更改指针,请使用指针的副本 - 例如您已经创建的变量,然后返回该变量。

于 2012-10-17T12:56:35.593 回答
4

参数在函数dest内部被递增(在while条件下)四次("bye"包括 4 个字符,包括将在 的最终迭代中分配的 null while),copyArray()然后返回它的值以new指向name + 4

new指向从的开始name返回。acopyArray()

于 2012-10-17T12:57:48.573 回答