c - 具有位域的结构大小的输出

标签 c structure

#include<stdio.h>
static struct s
{

    unsigned a:5;
    unsigned b:5;
    unsigned c:5;    
    unsigned d:5;

}v={1,2,3,4};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

“答案是 4”。我无法解释这个输出。

#include<stdio.h>
static struct s
{

    unsigned a:5;
    unsigned b:5;

}v={1,2};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

“答案仍然是 4” .. 位域如何影响结构大小??

最佳答案

默认情况下,gcc 在字节边界上对齐数据,而在某些平台(尤其是 RISC)上,在机器字边界上对齐数据。这是因为非字节对齐读取(在 RISC 机器上)会导致异常,从而减慢程序速度。 这就是为什么每个字段都存储在自己的字节中,即使它们只有 5 位长。为了正确打包,使用 __attribute__((packed)):

#include<stdio.h>

static struct s
{
    unsigned a:5 __attribute__((packed));
    unsigned b:5 __attribute__((packed));
}v={1,2};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

这个的输出是:

size of v = 2

这是预期的,因为您总共有 10 个字节,大小四舍五入到下一个字节。

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

相关文章:

c - 从 C 字符串中提取 "whole number"和 "decimal"?

c++ - 通过引用传递结构并分配字符串

c - 使用指针写入和读取(fwrite - fread)结构

Android 链接 .so 用于命令行可执行文件?

c - pthread_cancel 返回 EINPROGRESS

c - 我该如何打印这个?

c - 从 C 中的二进制文件中读取 i 结构

c - 我的段错误

c++ - 在二进制追加中获取 ftell() 的问题

c - 如何更改指向的值并同时增加指针