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