在linux下进行C编程,有时候会绵连结构体的大小问题。结构体大小并不等于其内部所有成员大小之和,这个主要是由于结构体需要内部对齐造成的,比如struct a{ int a; long b}它的大小可能就是16,而不是12,因为long为8个字节,int为4个字节,这里面需要8字节对齐。而struct a{ int a; int b; long c;}同样是16个字节,这是因为前面2个int刚好8字节,和后面的long一样。所有如果想在程序中基于偏移量来获取结构体成员的值时,靠人工计算该成员相对于结构体首地址的偏移量是有问题的。还是借助linux内核中一个很经典的函数思想来实现,contains of,先将结构体指针赋值为0,然后打印出该成员的地址,将地址转换成int值,就得到了该成员相对于结构体首地址的偏移量。后面得到一个结构体指针后,加上该偏移量,就是该成员的真实地址。
//测试模块中所定义的结构体的大小,便于后期大小设置访问
//检测是否出现struct中字段出现位不齐问题
#include <stdio.h>
#include <stdlib.h>
struct addr_space {
unsigned int in_episode_head; //是否在幕头中
unsigned long offset; //addr在幕头,offset为幕文件地址;addr在元数据,offset为幕头aadr的偏移
unsigned int iblock; //地址空间,0-未分配空间,1-已分配空间
unsigned long allocated_size; //已分配的空间大小
unsigned long used_size; //已使用的空间大小
};
//幕头结构(存储在文件头部,固定长度)
struct episode_head {
unsigned int magic1; //魔数1
unsigned int num; //数据种类的数量
struct addr_spac

本文讲述了在Linux环境下C编程中遇到的结构体大小问题,重点介绍了如何通过`offsetof`函数计算成员的偏移量,避免因对齐导致的访问错误。讨论了结构体对齐原理和实际应用实例,以及不同结构定义对大小的影响。

948

被折叠的 条评论
为什么被折叠?



