2010-04-13 2 views
0

잘못된 주소 제공 :아래에 정의 된 바와 같이 나는 구조 내부에 노조를 선언 할 필요가 있었다

struct MyStruct 
{ 
    int m_DataType; 
    DWORD m_DataLen; 
    union theData 
    { 
     char m_Buff [_MAX_PATH]; 
     struct MyData m_myData; 
    } m_Data; 
}; 

는 처음에, 나는 다음과 같이 노동 조합의 데이터에 액세스 시도를 (I 전에 하여 m_Data 선언을) 추가 :

MyStruct m_myStruct; 

char* pBuff = m_myStruct.theData::m_Buff; 

이 pBuff에 반환하지만 나는 내가 m_Buff 버퍼에 기록 된 생각하면 m_DataType & m_DataLength 회원을 덮어 나를 인한 MYSTRUCT 구조의 시작 부분에 대한 포인터를 컴파일합니다.

Visual Studio 2008을 사용하고 있습니다.이 예기치 않은 동작을 설명 할 수 있습니까? 감사.

답변

2

당신은 서면으로해야합니다

char *pBuff = m_myStruct.m_Data.m_Buff; 

내가 쓴대로 컴파일하는 방법을 알고 싶습니다.

+0

네, 기본적으로 제 질문입니다. 컴파일 된 이유 또는 왜 잘못 된 이유인지 이해하지 못합니다. 지금 m_myStruct.m_Data.m_Buff 사용하고 있지만 이전 액세스 메서드에 대한 컴파일러의 추론을 이해하기를 원했습니다. – AlanKley

+0

컴파일 중이십니까? 정말? 당신이 쓴 것을 합법적으로 해석 할 수 없기 때문에 다시 검사 할 수 있습니까? 그리고 컴파일러가 '버그'를 생각할 때 손가락을 가리킬 것입니다. –

+0

및 AlanKley : 저는 여러 버전의 MSVC++로 Alan의 예를 컴파일했으며 현재 VC2010 릴리스를 통해 오류없이 컴파일됩니다. 표현의 결과는 Alan이 묘사 한 것과 똑같습니다. 시도한 다른 모든 컴파일러에 적절한 오류 메시지가 표시됩니다. –

1

이 말이 아닙니까?

char* pBuff = m_myStruct.m_Data.m_Buff; 
+0

왜 노조가 필요한가요? 문맥을 좀주세요. –

+0

네, 그게 제가 지금 사용하고있는 것이지만 이전 방법이 왜 그렇게 작동했는지에 대한 통찰력을 찾고있었습니다. – AlanKley

+0

이전 방법을 컴파일 했습니까? 그렇다면 포인터를 인쇄하고 게시물을 편집 할 수 있습니까? –

2

컴파일해서는 안됩니다. GCC barfs with this code :)

 
union.cpp:17: error: ‘MyStruct::theData’ is not a base of ‘MyStruct’ 
+1

VS2008에서 좋았을 것입니다. 그런 다음 문제를 디버그하지 않아도되고 데이터에 액세스하기 위해 적절한 선언을 추가하도록 경고되었을 것입니다. 그것을 확인해 주셔서 감사합니다. – AlanKley