我的任务是开发一个包含两行memcpy代码的程序。所以我现在正在研究memcpy并发现了这一点。

int main() {
    char a[10] = "123456789";
    cout<<a<<endl;
    char b[5];
    memcpy(b, a, 10);
    cout<<a<<endl;
    cout<<a-5<<endl;
    cout<<b<<endl;
}


输出将是:

123456789
6789
123456789
123456789


知道为什么这里的指针改变了吗?

最佳答案

a是一个数组,而不是一个指针。在堆栈上,有一个很大的区别,我在答案here中对此进行了描述。
a在堆栈上高于b,因此,当您将10个字节从a复制到b时,您已经从5末尾移走了b个字节,并替换了第一个 5个字节。请注意,此特定行为在很大程度上取决于编译器标志和编译器版本,并且通常来说是未定义的。
另外要注意的是,您尚未打印a的地址,这就是我假设您所说的a的地址。相反,您已经打印了存储在那里的值。

10-08 20:02