出于某种原因,我无法完全弄清楚,我的仅包含位域的结构体联合会设置两倍于任何单个结构体所需的字节数。
#include <stdio.h>
#include <stdlib.h>
union instructionSet {
struct Brane{
unsigned int opcode: 4;
unsigned int address: 12;
} brane;
struct Cmp{
unsigned int opcode: 4;
unsigned int blank: 1;
unsigned int rsvd: 3;
unsigned char letter: 8;
} cmp;
struct {
unsigned int rsvd: 16;
} reserved;
};
int main() {
union instructionSet IR;// = (union instructionSet*)calloc(1, 2);
printf("size of union %ld\n", sizeof(union instructionSet));
printf("size of reserved %ld\n", sizeof(IR.reserved));
printf("size of brane %ld\n", sizeof(IR.brane));
printf("size of brane %ld\n", sizeof(IR.cmp));
return 0;
}
所有对sizeof的调用都返回4,但据我所知它们应该返回2。
sizeof
返回size_t
,必须使用%zu
进行打印。 - phuclvint
是 4 字节,那么int x:1
将被打包成一个对齐的 4 字节整数。多个位域可以被打包到其中,但包含结构的大小将是 4 的倍数。 - Tom Karzesunsigned char
不被允许,那么代码就违反了6.7.2.1 5中的约束,因此需要产生诊断消息。因此,如果没有诊断消息,则实现已经定义它是被允许的,我们可以知道这段代码将会做什么。 - Eric Postpischil