C语言使用->访问结构体成员报错与位域语法作用相关疑问
问题解答
1. Invalid type argument of "->"报错原因
->是C语言中专门用于访问指针类型结构体/联合体成员的运算符,你代码中定义的prologue是footer类型的普通栈变量,不是指针,类型不匹配因此触发编译错误。
2. 是否应该改为.的写法
是的,prologue.block_size = 16;是正确写法。只有当变量是结构体指针类型时才需要使用->,示例如下:
// 指针类型的结构体变量,用->访问成员 footer *prologue_ptr = malloc(sizeof(footer)); prologue_ptr->block_size = 16; // 也可以解引用指针后用.访问,和上面写法等价 (*prologue_ptr).block_size = 16;
3. 位域语法的作用
block_size : BLOCK_SIZE_BITS是C语言的**位域(bit field)**语法,不是给成员赋默认值,作用是显式指定该成员在内存中占用的二进制位(bit)数量,用来压缩结构体的内存占用。
你定义的三个成员总占用位数为16+32+16=64bit,配合__attribute__((__packed__))取消结构体内存对齐后,整个footer结构体仅占用8字节,远小于不使用位域时3个uint64_t成员共24字节的占用,非常适合协议头、磁盘存储结构这类对内存占用敏感的场景。
注意:不同编译器对位域的内存排布规则可能存在差异,跨平台使用时需要额外处理字节序兼容性问题。
内容的提问来源于stack exchange,提问作者randomNameGenerator
相关产品推荐
相关产品推荐

