我在使用memcpy(). 我想数组的值复制v到oldv只有一次,然后更改的值v。我调用memcpy()了代码的第一部分,它做了它应该做的事情,但是在第二部分中,当我更改数组v然后再次打印vand oldv... 没有memcpy()第二次调用时,值也oldv发生了变化。为什么 ?编译器将 new 复制v到oldv而不调用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)
你的调用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将来使用。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |