C中涉及结构内部联合的奇怪行为

C中涉及结构内部联合的奇怪行为,c,C,当我在结构内部使用联合体时,我观察到一种奇怪的行为,我不知道是否应该如此。Basicall当一个结构中有一个包含两个成员的并集时,由于某种原因,我无法访问这两个元素,我只得到第一个元素,不管我请求的是第一个还是第二个成员 我写了一个测试类: #include <stdio.h> #include <stdlib.h> struct uni { char *a; char *b; }; union stru { struct uni unInStruc1

当我在结构内部使用联合体时,我观察到一种奇怪的行为,我不知道是否应该如此。Basicall当一个结构中有一个包含两个成员的并集时,由于某种原因,我无法访问这两个元素,我只得到第一个元素,不管我请求的是第一个还是第二个成员

我写了一个测试类:

#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);

}
即使在我试图访问
b
的代码中,我得到的是
a
。我无法访问任何联合中的第二个字符串
b

当我将初始化更改为

union stru new = {{"string 1 in A", "string 2 in A"}
                    , {NULL,"string 2 in B"}
                    , "test"};
有时出现seg故障,有时输出为:

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

如果我遗漏了什么东西,有人能解释一下吗首先,你的代码的目的是什么?
联盟占用的内存将足够大,可以容纳联盟中最大的成员。您正在为同一位置分配不同的值,而内存位置保留最后一个值。将新值分配给不同的成员时,旧成员值会损坏。在您的代码中,您在最后将“test”分配给union成员test,这样才不会损坏它

你似乎不明白什么是工会。它一次只能保存一个成员,因为两个成员都存储在同一内存中。访问联合的任何成员,但访问上一次设置其值的成员只是一个错误。@DavidSchwartz,除非您使用
char*
member访问它。我很惊讶您竟然可以编译这个。我不能<代码>t.c:18:23:错误:初始值设定项末尾的额外大括号组(gcc 7.2)您使用的是哪种编译器?
(null)
(null)
string 1 in A
string 1 in A
test