Ссылка на объединение внутри структуры с помощью тега объединения дает неверный адрес - PullRequest
0 голосов
/ 13 апреля 2010

Мне нужно было объявить объединение внутри структуры, как указано ниже:

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

Изначально я попытался получить доступ к данным объединения следующим образом (до того, как я добавил объявление m_Data):

MyStruct m_myStruct;

char* pBuff = m_myStruct.theData::m_Buff;

Это компилирует, но возвращает pBuff указатель на начало структуры MyStruct, что заставило меня перезаписать элементы m_DataType & m_DataLength, когда я думал, что записываю в буфер m_Buff.

Я использую Visual Studio 2008. Кто-нибудь может объяснить это неожиданное поведение? Спасибо.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2010

Это не должно компилироваться. GCC barfs в этом коде с:)

union.cpp:17: error: ‘MyStruct::theData’ is not a base of ‘MyStruct’
2 голосов
/ 13 апреля 2010

Вы должны написать:

char *pBuff = m_myStruct.m_Data.m_Buff;

Хотелось бы, чтобы я знал, как он собирался, как написано.

1 голос
/ 13 апреля 2010

Разве вы не имеете в виду это?

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