gpt4 book ai didi

c - C 中位域结构的大小

转载 作者:行者123 更新时间:2023-12-02 00:00:31 27 4
gpt4 key购买 nike

我有一个用 C 语言表示的带有位精度字段的 IP header :

typedef struct __attribute__((packed)) {
unsigned char __reserved : 1;
unsigned char dont_fragment : 1;
unsigned char more_fragment : 1;
unsigned short fragment_offset : 13; // if fragmented, in 8 byte units from the start of the datagram
} ipv4_fragmenting;

我使用可以存储在 2 个字节上的 16 位。那么为什么结构体的大小 (sizeof(ipv4_fragmenting)) 是 4 而不是 2?

我的编译器:GCC 4.8.1

编辑:

如果位域是如此特定于平台并且打包属性不可靠,那么什么是表示先前定义的协议(protocol)(如 IPv4)元素的正确解决方案?

最佳答案

就像我已经评论过的那样,推测位域和结构大小没有实际意义,因为语言在这方面没有强制要求。

至于 GCC 4.8.1 上的大小为 4(假设是 32 位编译器);这可能是 GCC 4.8.1 上的错误。我提出了 question on SO以前设置 packed 属性的地方没有按预期工作,就像这里一样。对于仅使用 #pragma pack 的字节对齐打包有效。示例:

#include <stdio.h>

#pragma pack(push, 1)
typedef struct {
unsigned char __reserved : 1;
unsigned char dont_fragment : 1;
unsigned char more_fragment : 1;
unsigned short fragment_offset : 13; // if fragmented, in 8 byte units from the start of the datagram
} ipv4_fragmenting;
#pragma pack(pop)

int main()
{
printf("%u\n", sizeof(ipv4_fragmenting));
}

这为我打印了 3,正如在 ILP32 上预期的那样机器 MinGW GCC 4.8.1。

关于c - C 中位域结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21676960/

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