首页 > 试题广场 >

下面的代码输出是()

[单选题]
下面的代码输出是()
int main() {
    union Data {
        struct {
            int x;
            int y;
        } s;
        int x;
        int y;
    } d;
    d.x = 1;
    d.y = 2;
    d.s.x = d.x * d.x;
    d.s.y = d.y + d.y;
    printf("%d %d\n", d.s.x, d.s.y);
    return 0;
}


  • 1 4
  • 4 4
  • 1 2
  • 4 8
union中的所有成员相对于基地址的偏移量都为零。d.x,d.y和d.s.x的起始地址都相同,共享内存空间,给任意一个变量赋值,其他两个变量也会赋相同的值。

注:由于d是局部变量, d.s.y未初始化之前输出应该是个随机值,而不是0.
编辑于 2017-08-14 20:17:13 回复(16)
来自@小松nino
union中各成员共享一段内存空间,一个union的长度等于各成员中最长的长度。
所以本题中,d 的长度等于struct  s的长度,为八字节(假设是32位)。
具体如图所示:

d.x,d.y以及d.s.x都是前四个字节,所以他们的值永远相等,
d.x=1;///d.x=d.y=d.s.x=1;
d.y=2;///d.x=d.y=d.s.x=2;
d.s.x=d.x*d.x;///d.x=d.y=d.s.x=2*2=4;
d.s.y=d.y*d.y;///d.x=d.y=d.s.x=4+4=8;
编辑于 2018-05-20 15:18:55 回复(9)
union中各成员共享一段内存空间,一个union的长度等于各成员中最长的长度。
所以本题中,d 的长度等于struct  s的长度,为八字节(假设是32位)。
具体如图所示:

d.x,d.y以及d.s.x都是前四个字节,所以他们的值永远相等,
d.x=1;///d.x=d.y=d.s.x=1;
d.y=2;///d.x=d.y=d.s.x=2;
d.s.x=d.x*d.x;///d.x=d.y=d.s.x=2*2=4;
d.s.y=d.y*d.y;///d.x=d.y=d.s.x=4*4=8;
发表于 2017-08-15 12:12:18 回复(0)

union(联合):一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当我们给union的某个成员赋值后,该union的其他成员就变成未定义的状态了。一个union的大小取决于它的最大的数据成员,所有的成员共享一块内存空间


union Test {
    int i;
    char c;
};

int main() {
    Test t;
    t.i = 65;
    cout << t.c;
    return 0;
}

/*
输出:
A
*/

A的ASCII值为65,我们先为union中的int值赋值65,然后使用char来访问这块内存中的数据,结果输出A。即它们共享相同的存储空间


现在我们假设这个union在内存中的开始地址为0:

地址 int x int y struct s
8
4 y
0 x y x

过程:

d.x = 1:结果d.xd.yd.s.x都为1

d.y = 2:结果d.xd.yd.s.x都为2

d.s.x = d.x * d.x:结果d.xd.yd.s.x都为4

d.s.y = d.y + d.y:结果d.s.y为8

发表于 2022-03-11 10:07:39 回复(0)
union中所有成员相对于基地址的偏移量都为零,d.x,d.y,d.s.x的起始地址都相同,共享地址空间,给任意一个变量赋值,其他两个变量也会赋相同的值
发表于 2022-03-06 14:54:31 回复(0)
union中各成员共享一段内存空间,一个union的长度等于各成员中最长的长度。
所以本题中,d 的长度等于struct  s的长度,为八字节(假设是32位)。
具体如图所示:

d.x,d.y以及d.s.x都是前四个字节,所以他们的值永远相等,
d.x=1;///d.x=d.y=d.s.x=1;
d.y=2;///d.x=d.y=d.s.x=2;
d.s.x=d.x*d.x;///d.x=d.y=d.s.x=2*2=4;
d.s.y=d.y*d.y;///d.x=d.y=d.s.x=4*4=8;
发表于 2017-09-07 16:51:14 回复(1)
4.8
发表于 2017-08-10 16:14:56 回复(3)
发表于 2023-10-19 20:54:24 回复(0)

联合体共享内存,每次改变其中一个成员的值都将导致其他成员的值跟着改变

发表于 2019-06-26 10:12:07 回复(0)
内存右对齐吖右对齐。
发表于 2017-08-15 09:56:04 回复(1)
学习了
发表于 2023-09-09 20:21:16 回复(0)
做了这道题之后终于知道联合体是干啥的。
发表于 2023-03-15 09:31:48 回复(0)
union中所有成员相对于基地址的偏移量都为零,d.x,d.y,d.s.x的起始地址都相同,共享地址空间,给任意一个变量赋值,其他两个变量也会赋相同的值.

发表于 2022-10-07 22:04:38 回复(0)
求解
发表于 2022-09-08 20:41:13 回复(0)
标记
发表于 2022-08-20 00:05:02 回复(0)
union中成员共用一段内存,一个成员变量变,所有成员变量变
发表于 2022-03-18 13:24:01 回复(0)
评论中图示已经很清楚了,添加代码注释
int main() {
    union Data {
        struct {
            int x;
            int y;
        } s;
        int x;
        int y;
    } d;
    d.x = 1;				// x = 1, y = 1, s.x = 1. s.y = 未初始化随机值
	printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y);
    d.y = 2;				// x = 2, y = 2, s.x = 2. s.y = 未初始化随机值
	printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y);
    d.s.x = d.x * d.x;		// x = 4, y = 4, s.x = 4. s.y = 未初始化随机值
	printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y);
    d.s.y = d.y + d.y;		// x = 4, y = 4, s.x = 4. s.y = 8	// 因为s.y在s.x后面,所以修改它不会影响到前面的三个值
    printf("%d %d %d %d\n", d.x, d.y, d.s.x, d.s.y);
    return 0;
}


编辑于 2022-03-12 15:21:57 回复(0)
按最大成员长度初始化分配一次,后续成员一直重复从起始位置覆盖分配
发表于 2022-03-08 09:31:32 回复(0)
int x,y两个变量占用同一个内存区域
发表于 2020-03-17 22:16:40 回复(0)
union为联合,所有成员共享同一存储空间,但任一时刻只有一个成员可以被赋值,重新赋值则替换原有赋值,这里有x,y,struct类型,所以按照顺序依次替换值,得到最终联合的结果。
发表于 2018-07-23 18:30:21 回复(0)