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

时间:2017-10-24 17:17:31

标签: c

当我在结构中使用工会时,我发现了一个奇怪的行为,我不知道是否应该是这种情况。 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);

}

此代码输出:

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

即使在代码中我试图访问b我得到的是a。我无法访问任何联盟中的第二个字符串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 个答案:

答案 0 :(得分:0)

首先,您的代码的目的是什么? 联盟占用的内存足够大,可以容纳联盟中最大的成员。您正在为同一位置分配不同的值,并且内存位置包含最后一个值。将新值分配给不同的成员时,旧的成员值会损坏。在您的代码中,您最后将“test”分配给union成员测试 - 所以只有这样才不会被破坏。