即使没有第二次调用 memcpy 也总是复制该值?

saa*_*hir 1 c++ memcpy

我在使用memcpy(). 我想数组的值复制voldv只有一次,然后更改的值v。我调用memcpy()了代码的第一部分,它做了它应该做的事情,但是在第二部分中,当我更改数组v然后再次打印vand oldv... 没有memcpy()第二次调用时,值也oldv发生了变化。为什么 ?编译器将 new 复制voldv而不调用memcpy().

#include<iostream>
#include<stdio.h>
#include <cstring>

using namespace std;

int main()
{   
    double **v,**oldv;

    v = new double*[3];

    for(unsigned int i=0; i<3; i++)
        v[i] = new double[2];

    oldv = new double*[3];

    for(unsigned int i=0; i<3; i++)
        oldv[i] = new double[2];

    for(unsigned int i=0; i<3; i++)
    {
        for(unsigned int j=0; j<2; j++) 
            v[i][j] = i+j;
    }

    for(int i = 0; i<3; i++)
    {
        memcpy(&oldv[i], &v[i], sizeof(v[0]));
    }

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<2;j++)
            cout << v[i][j] << " ";

        cout << endl;
    }

    cout << "=================== cpytab ================" << endl;

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<2;j++) 
            cout << oldv[i][j] << " ";

        cout << endl;
    }

    cout << endl;

    for(unsigned int i=0; i<3; i++)
    {
        for(unsigned int j=0; j<2; j++) 
            v[i][j] = 2*(i+j);
    }

    cout << "==================value changed=============" << endl;

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<2;j++) 
            cout << v[i][j] << " ";

        cout << endl;
    }

    cout << "====================cpytableau==============" << endl;

    for(int i=0;i<3;i++)
    {
        for(int j=0;j<2;j++) 
            cout << oldv[i][j] << " ";

        cout << endl;
    }

    cout << endl;

    for(unsigned int j=0;j<2;j++)
        delete[] v[j];

    delete[] v;

    for(unsigned int j=0;j<2;j++) 
        delete[] oldv[j];

    delete[] oldv;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

lee*_*mes 5

你的调用memcpy是错误的:

memcpy(&oldv[i], &v[i], sizeof(v[0]));
Run Code Online (Sandbox Code Playgroud)

在这里复制指针,而不是数组内容。对于数组内容,删除&并提供数组的运行时已知大小。(您将 sizeof 应用于指针,它为您提供指针的大小,而不是它指向的数组的大小,不能使用 sizeof 查询)。

所以尝试:

memcpy(oldv[i], v[i], 2 * sizeof(v[0][0]));
Run Code Online (Sandbox Code Playgroud)

如果这不是编程作业或练习,请考虑std::vector将来使用。