2010-12-14 4 views
1

구조체에서 다른 곳으로 데이터를 복사하려고합니다. 각 구조체가 처리 할 수있는 바이트는 동일합니다. 내 선언과 memcpy는 다음과 같습니다.오류 컴파일러는 매개 변수 2를 const MyStruct1에서 const void *로 변환 할 수 없습니다. memcpy의 경우

typedef struct{ 
     CString strNumber; 
     CString strAlpha; 

    } _Number; 

    typedef struct{ 
     CString strIterration; 
     _Number NumberOne; 
     _Number NumberTwo; 
    } _Store; 

_Store Data1; 
_Store Data2; 

이제 첫 번째 구조체 Data1에는 데이터가 있고 두 번째 구조체는 방금 선언되었습니다. 오류가 나타나는 내가 컴파일 할 수

memcpy(&Data2, Data1, sizeof(_Store)); 

:

나는 다음과 같은 코드를 사용하고 있습니다. 어떤 아이디어? 데이터를 복사하는 다른 방법은 없습니까?

+0

'_Number'와'_Store' 이름은 코드에서 유효하지 않습니다 (접두어'_A' -'_Z'는 컴파일러의 내부 용으로 예약되어 있습니다). 게다가, C++에서는 struct를 typedef 할 필요가 없습니다. 그래서 :'struct Number {CString strNumber; CString strAlpha; }; ' – MSalters

답변

7

당신은 두 구조체에 &를 사용해야합니다 :

memcpy(&Data2, &Data1, sizeof(_Store)); 

는주의 : _Store (이것은 MFC CString 같은 경우) 복사 가능한 비트 단위되지 CString 멤버 변수가 포함되어 있습니다. 비트 복사 가능 유형에만 memcpy()을 사용해야합니다. 그렇지 않으면 정의되지 않은 동작으로 실행될 위험이 있습니다.

+0

그것은 작동합니다, 고마워요! 몇 가지 질문은 : Data1은 왜 참조로 불리는 변경되지 않습니다? 그리고 여전히 정의되지 않은 행동입니까? 의미? – Sunscreen

+0

@Sunscreen : 아마도'CString'은 바이트 단위 이상일 것입니다 (아마도 힙에 할당 된 메모리에 대한 포인터를 포함 할 것입니다). 단지 memcpy 만 할 수는 없습니다. Geoff의 대답은 적절한 접근법을 가지고 있습니다. 할당 연산자 만 사용하십시오. – sbi

+0

/* *이 ASSERT가 실패하면 잘못된 포인터가 전달되었습니다.이 포인터는 완전히 거짓이거나 * 다른 힙에서 할당되었을 수 있습니다. * 포인터는 '로컬'힙에서 가져와야합니다. */ _ASSERTE (_CrtIsValidHeapPointer (pUserData)); – Sunscreen

2

명백한 다른 접근법은 간단한 할당, 즉 Data2 = Data1;

이렇게하면 _Store 구조에있는 바이트 수와 CString에 연산자 =가 있는지 여부를 관리하지 않아도됩니다.

관련 문제