構造体内で共用体を使用すると、私は奇妙なバハビールを観察しましたが、そうでなければならないかどうかはわかりません。 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
私が何かか何か
を欠けている場合誰かがこれを説明することができます
あなたは組合が何であるか理解していないようです。両方のメンバが同じメモリに格納されているため、一度に1つのメンバしか保持できません。 – Barmar
ユニオンのメンバーにアクセスできますが、最後に値を設定したメンバーにアクセスするのは単なるエラーです。 –
この場合、3つのうちの2つは同じタイプであるため、理由はありません。コンパイラがあなたのような組合を初期化することは無意味だと警告していないとは思えません。すべての警告がオンになっていますか? –