gpt4 book ai didi

c - 为什么使用 char* 来处理 union 地址?

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:37 25 4
gpt4 key购买 nike

union a {
struct a_header a_hdr;
struct b b_hdr;
};

bzero((char*)(&(&a->a_hdr)[1]), sizeof(struct b) - sizeof(struct a_header));

这个调用是做什么的? (char*)(&(&a->a_hdr)[1]) 指向哪里?

最佳答案

struct b 大于 struct a_header 的假设下工作(否则 sizeof(struct b) - sizeof(struct a_header) 会为零或非常大,因为 size_t 不能为负数),此语句清除 union a 中被 b_hdr 使用但 的任何字节不是 a_hdr

分解表达式:

&a->a_hdr

给定 a 是指向 union a 的指针,这将获取 a_hdr 字段的地址

(&a->a_hdr)[1]

这将上述地址视为一个数组并获取偏移量 1 处的元素。没有元素,所以这是未定义的行为,但我们有:

&(&a->a_hdr)[1]

由于 a[b] 完全等同于 *(a + b),所以上面的内容等同于:

&(*(&a->a_hdr + 1))

相邻的&*相互抵消,所以现在你有:

&a->a_hdr + 1

所以这指向长度为 1 的数组之后的一个元素,即 a->a_hdr。正是这个地址被传递给 bzero。转换为 char * 是不必要的,因为 bzerovoid * 作为其第一个参数。

第二个参数:

sizeof(struct b) - sizeof(struct a_header)

同样,假设 struct b 大于 struct a_header,这给了我们 struct b 大的字节数。所以 b_hdr不是 a_hdr 使用的字节被清除。

为了说明,假设 struct b 是 8 个字节,struct a_header 是 4 个字节。然后 union a 看起来像这样:

---------------------------------
| X | X | X | X | X | X | X | X |
---------------------------------
| struct b |
---------------------------------
|struct a_header|
-----------------

其中 X 是一些未知的字节值。在上面调用 bzero 之后,它看起来像这样:

---------------------------------
| X | X | X | X | 0 | 0 | 0 | 0 |
---------------------------------
| struct b |
---------------------------------
|struct a_header|
-----------------

关于c - 为什么使用 char* 来处理 union 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53165004/

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