2014-11-13 1 views
1

memcpy()을 사용하는 중에 문제가 있습니다. 배열 v의 값을 oldv으로 한 번만 복사 한 다음 v의 값을 변경하고 싶습니다. 코드의 첫 번째 부분에서 memcpy()을 호출했으나 수행해야 할 작업을 수행했지만 두 번째 부분에서는 배열 v을 변경 한 다음 voldv을 다시 인쇄했습니다 ... 두 번째로 memcpy()을 호출하지 않고 값 oldv도 변경되었습니다. 왜 ? 컴파일러에서 새 voldv으로 복사 한 후 memcpy()을 호출하지 않았습니다.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; 
} 
+0

Thaaanks sir it works ... !! –

+0

다행이었습니다. 나는 당신이 그것을 받아 들일 수 있도록 대답으로 변환했다. :) (문제가 해결 될지 확신 할 수 없으므로 먼저 댓글로 썼습니다.) – leemes

답변

4

memcpy에 대한 귀하의 전화가 잘못 : 여기

memcpy(&oldv[i], &v[i], sizeof(v[0])); 

당신이 포인터 아닌 배열 내용을 복사합니다. 배열 내용의 경우 &을 제거하고 런타임에 알려진 배열 크기를 제공하십시오. (sizeof를 포인터에 적용하면 sizeof를 사용하여 쿼리 할 수없는 포인터가 가리키는 배열이 아니라 포인터의 크기를 알 수 있습니다.

그래서 시도 :

memcpy(oldv[i], v[i], 2 * sizeof(v[0][0])); 

이 프로그래밍 할당 또는 운동 아닌 경우, 미래에 std::vector을 사용하는 것이 좋습니다.

관련 문제