0%

C语言 共用体的成员访问

C语言 共用体的访问

共用体的访问与结构体类似,也是有2中类型,我们只看看成员访问运算符.

所以按照通用的赋值方式,来看一下是否按照我们预定的方式运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*beginner/union/union2.c*/
#include <stdio.h>
#include <string.h>

union Data {
int i;
float f;
char str[20];
};

int main()
{
union Data data;

data.i = 123;
data.f = 456.0;
strcpy(data.str, "Hello World");

printf("data.i : %d\n", data.i);
printf("data.f : %f\n", data.f);
printf("data.str : %s\n", data.str);

return 0;
}

从结果上来看,what are you弄啥嘞,感觉什么跟什么呀,只有最后的字符串是正确的,这也就间接证明了共用体使用相同的存储空间,其他类型的赋值会破坏原先的赋值,正常情况下只有最后一次的赋值才会保证正确结果。

所以我们需要在每次赋值后直接查看结果,是可以保证结果正确的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*beginner/union/union3.c*/
#include <stdio.h>
#include <string.h>

union Data {
int i;
float f;
char str[20];
};

int main()
{
union Data data;

data.i = 123;
printf("data.i : %d\n", data.i);

data.f = 456.0;
printf("data.f : %f\n", data.f);

strcpy(data.str, "Hello World");
printf("data.str : %s\n", data.str);

return 0;
}

再次运行,可以看到结果就按照预想的进行了。

编译运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#beginner/union/Makefile
ALL : union1 union2 union3

union1: union1.c
gcc -o union1 union1.c

union2: union2.c
gcc -o union2 union2.c

union3: union3.c
gcc -o union3 union3.c

.PHONY : clean

clean:
rm -f union1 union2 union3

输出结果

1
2
3
4
5
6
7
8
9
$ ./union2
data.i : 1819043144
data.f : 1143139122437582505939828736.000000
data.str : Hello World

$ ./union3
data.i : 123
data.f : 456.000000
data.str : Hello World
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道