C中的位字段填充

Jos*_*siP 4 c

继续我在C中的实验,我想看看位字段是如何放在内存中的.我正在使用英特尔64位机器.这是我的一段代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
int main(int argc, char**argv){
       struct box_props
       {
         unsigned int opaque       : 1;
         unsigned int fill_color   : 3;
         unsigned int              : 4; 
         unsigned int show_border  : 1;
         unsigned int border_color : 3;
         unsigned int border_style : 2;
         unsigned int              : 2; 
       };

       struct box_props s;
       memset(&s, 0, 32);
       s.opaque = 1;
       s.fill_color = 7;
       s.show_border = 1;
       s.border_color = 7;
       s.border_style = 3;

       int i;
       printf("sizeof box_porps: %d sizeof unsigned int: %d\n", sizeof(struct box_props), sizeof(unsigned int));
       char *ptr = (char *)&s;
       for (i=0; i < sizeof(struct box_props); i++){
          printf("%x = %x\n", ptr + i, *(ptr + i));
       }

       return 0;
Run Code Online (Sandbox Code Playgroud)

这是一个输出:

sizeof box_porps: 4 sizeof unsigned int: 4
5be6e2f0 = f
5be6e2f1 = 3f
5be6e2f2 = 0
5be6e2f3 = 0
Run Code Online (Sandbox Code Playgroud)

这里有一个问题:为什么struct box_props有大小4- 它不能只是2字节?在这种情况下如何填充?我有点(nomen omen)与它混淆.

提前获取所有答案

Dee*_*epu 9

即使在这种情况下总需求仅为2字节(1 + 3 + 4 + 1 + 3 + 2 + 2),所使用的数据类型(unsigned int)的大小为4字节.所以分配的内存也是4字节.如果您只想将2字节分配 unsigned short用作数据类型并再次运行程序.


Imr*_*err 6

从ISO C标准:

实现可以分配足够大的任何可寻址存储单元来保持位字段.(以及之后)结构或联合的末尾可能有未命名的填充.

因此,不需要总是为结构选择尽可能小的内存块.由于32位字可能是编译器的原生大小,因此它就是它所选择的.