gpt4 book ai didi

c - 为什么此代码的输出与预期不同?

转载 作者:行者123 更新时间:2023-11-30 19:27:01 25 4
gpt4 key购买 nike

我正在学习 C 结构体和 union ,并且遇到了这段代码。据我所知, union 的工作方式类似于对象,因此 printf 应该与a、b、c、d

#include <stdio.h>

union Type {
char A[2];
struct{
char B;
char C;
};
};

int main(){

Type Data;
Data.A[0] = 'a';
Data.A[1] = 'b';
Data.B = 'c';
Data.C = 'd';

printf("%c %c %c %c \n", Data.A[0], Data.A[1], Data.B, Data.C);
return 0;
}

为什么输出实际上不是 a、b、c、d?

最佳答案

来自Union type

In C and C++, untagged unions are expressed nearly exactly like structures (structs), except that each data member begins at the same
location in memory
.

union 的大小是 union 中最大元素的大小。对于你的情况

union Type {
char A[2];
struct{
char B;
char C;
};
};

为整个 union 分配了总共两个字节,并且所有成员开始从 union 的相同基址起始地址访问数据

当这两个语句

Data.A[0] = 'a';
Data.A[1] = 'b';

看起来像

      A[0]                  A[1]
-------------------------------------------
| 'a' | 'b' |
-------------------------------------------
B C
0x100 0x101
|
lets assume 0x100 as base address of union

如果您访问 Data.A[0]Data.B,两者都会打印为 a 作为 Data .A[0]Data.B 开始从起始地址(即 0x100)访问数据。此外,Data.A[1]Data.C 将打印与从 0x101 内存位置访问数据相同的内容。

当下面这两个语句

Data.B = 'c';
Data.C = 'd';

执行,看起来像

               A[0]                       A[1]
------------------------------------------------------------------
| 'c' (overwritten 'a') | 'd'(overwritten 'b') |
-------------------------------------------------------------------
B C
0x100 0x101
|
lets assume 0x100 as base address of union

现在,如果您同时打印 Data.A[0]Data.B,它会打印 0x100 内存位置的数据,并且这是 c 因为早期的数据被覆盖。同样,Data.A[1]Data.C 都会打印 d

关于c - 为什么此代码的输出与预期不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56304089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com