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

标签 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 将目标字符串的原始内容减去更改的字符数(4 表示“再见”)移动到新地址并将其分配给 *dest

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

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

非常感谢您的回复!

最佳答案

问题出在这里

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

这在简单的英语中意味着将 src 指向的东西复制到 dest 指向的东西,然后递增 src 和 dest(即,将两个指针都指向下一个东西)。

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

关于c - 在 C 中,为什么当我修改其内容时我的指针参数会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12934784/

上一篇:c函数调用错误

下一篇:c - 冲刺崩溃

相关文章:

c - 内核虚拟内存结构是在进程即将执行时首先形成的吗?

c++ - 合并两个数组中的唯一元素

c++ - 指针赋值与指针运算

c - 这是访问功能的正确方法吗?

c - 发送分段数据报,每个分段均带有 UDP header

c - 让子进程暂停,直到收到父进程的执行 execl 任务的信号

function - 如何从 Scala 的方法中获取 Function 对象?

C++ win32线程createThread函数没有正确传递参数

c++ - 与 nullptr 原子地交换指针

c - C 中 *ptr += 1 和 *ptr++ 的区别