2010-04-13 18 views
0

j'avais besoin de déclarer une union à l'intérieur d'une structure telle que définie ci-dessous:Référencer une union dans une structure à l'aide étiquette syndicale donne une adresse incorrecte

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

Dans un premier temps, j'ai essayé d'accéder aux données syndicales comme suit (avant a ajouté la déclaration m_Data):

MyStruct m_myStruct; 

char* pBuff = m_myStruct.theData::m_Buff; 

Cette compile mais retourne à pBuff un pointeur au début de la structure MyStruct qui m'a fait remplacer les m_DataType & membres de m_DataLength quand je pensais que j'écrivais au tampon m_Buff. J'utilise Visual Studio 2008. Quelqu'un peut-il expliquer ce comportement inattendu? Merci.

Répondre

2

Vous devriez écrire:

char *pBuff = m_myStruct.m_Data.m_Buff; 

Je voudrais savoir comment il compilait comme écrit.

+0

Oui, c'est essentiellement ma question. Je ne comprends pas pourquoi cela a été compilé ou pourquoi il m'a donné le mauvais décalage. J'utilise maintenant m_myStruct.m_Data.m_Buff mais je voulais juste comprendre le raisonnement du compilateur pour la méthode d'accès précédente. – AlanKley

+0

Etes-vous sûr qu'il était en train de compiler? Vraiment sûr? Pouvez-vous vérifier à nouveau, parce que je ne vois aucune interprétation légitime pour ce que vous avez écrit, et pointer du doigt le compilateur pensant 'bug'. –

+0

et AlanKley: J'ai compilé l'exemple d'Alan avec plusieurs versions de MSVC++ et il compile sans erreur jusqu'à la version VC2010 d'aujourd'hui, et le résultat de l'expression est exactement comme décrit par Alan - aussi absurde que cela puisse paraître. Tous les autres compilateurs que j'ai essayés donnent un message d'erreur approprié. –

1

Vous ne voulez pas dire ça?

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

Pourquoi avez-vous besoin d'un syndicat? S'il vous plaît donner un contexte. –

+0

Oui, c'est ce que j'utilise maintenant, mais je cherchais à comprendre pourquoi la méthode précédente fonctionnait comme elle le faisait. – AlanKley

+0

La méthode précédente a-t-elle été compilée? Si oui, pouvez-vous imprimer le pointeur et éditer votre message? –

2

Il ne devrait pas compiler. GCC barfs à ce code avec :)

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

Cela aurait été bien dans VS2008, alors je n'aurais pas dû déboguer le problème et j'aurais été averti d'ajouter la déclaration appropriée pour accéder aux données avec. Merci d'avoir jeté un coup d'œil. – AlanKley