2017-10-24 5 views
-1

構造体内で共用体を使用すると、私は奇妙なバハビールを観察しましたが、そうでなければならないかどうかはわかりません。 Basicall何らかの理由で構造体の内部に2つのメンバを持つ共用体がある場合、どちらの要素にもアクセスすることはできません。最初のメンバか2番目のメンバを要求したとしても、最初のものだけを取得します。構造体内の共用体に関わるCの奇妙な振る舞い

私は、テストクラスを書いた:

#include <stdio.h> 
#include <stdlib.h> 

struct uni { 
    char *a; 
    char *b; 
}; 

union stru { 
    struct uni unInStruc1; 
    struct uni unInStruc2; 
    char *test; 

}; 

int main() { 
    union stru new = {{"string 1 in A", "string 2 in A"} 
        , {"string 1 in B","string 2 in B"} 
        , "test"}; 

    printf("%s", new.unInStruc2.a); 
    printf("%s", new.unInStruc2.b); 
    printf("%s", new.unInStruc1.a); 
    printf("%s", new.unInStruc1.b); 
    printf("%s", new.test); 

} 

このコードの出力:

string 1 in B 
string 1 in B 
string 1 in A 
string 1 in A 
test 

コードで私は何を得るのアクセスbにしようとしているにもかかわらずはaです。どの連合でも2番目の文字列bにアクセスできません。私は

union stru new = {{"string 1 in A", "string 2 in A"} 
        , {NULL,"string 2 in B"} 
        , "test"}; 

に初期設定を変更すると

時々私はワンセグ障害を受けると、時々、出力は次のようになります。

(null) 
(null) 
string 1 in A 
string 1 in A 
test 

私が何かか何か

を欠けている場合誰かがこれを説明することができます
+6

あなたは組合が何であるか理解していないようです。両方のメンバが同じメモリに格納されているため、一度に1つのメンバしか保持できません。 – Barmar

+2

ユニオンのメンバーにアクセスできますが、最後に値を設定したメンバーにアクセスするのは単なるエラーです。 –

+0

この場合、3つのうちの2つは同じタイプであるため、理由はありません。コンパイラがあなたのような組合を初期化することは無意味だと警告していないとは思えません。すべての警告がオンになっていますか? –

答えて

0

まず、コードの目的は何ですか? 共用体が占めるメモリーは、共用体の最大メンバーを保持するのに十分な大きさになります。同じ場所に異なる値を割り当て、メモリの場所に最後の値が保持されます。異なるメンバーに新しい値を割り当てると、古いメンバー値が破損します。あなたのコードでは、最後にunionメンバテストに 'test'を割り当てているので、壊れていないだけです。