offsetof和container_of

背景:在项目中,我将设备的配置信息封装在一个结构体中,并用一个unsigned int的变量上的某些位标志来对应某些配置项,该结构体需要被保存在本地配置文件中,程序启动时需要加载配置文件上记录的该结构体的配置信息,若不存在则将该结构体默认配置信息写入文件。在程序运行期间,若用户改变了某些配置,标志变量对应的标志位被置1,程序在得知发生变化的标志量后就将对应的配置信息更新到配置文件中。

  假设该结构体的原型如下:

typedef DevCfgInfo
{
    int Addr;
    char ConnectionStatus;
    char LoadName[NAME_SIZE];
}DevCfgInfo;

  程序运行期间,若用户改变了某个变量的值,将结构体中的某个配置项更新到配置文件对应的位置:
  (1)计算该变量偏移了结构体开头n个字节;
  (2)调用系统调用fseek()将文件指针定位到n个字节处理;
  (3)调用fwrite()函数更新该变量信息。
  其中在配置信息发生改变的变量具体结构体开头偏移的字节数计算方法如下:

#define NAME_SIZE 24

typedef struct 
{
    int Addr;
    char ConnectionStatus;
    char LoadName[NAME_SIZE];
}DevCfgInfo;

int main(void)
{
    DevCfgInfo info = {
        .Addr = 1,
        .ConnectionStatus = 1,
        .LoadName = "helloworld",
    };

    //printf("%d-%d-%s\n", info.Addr, info.ConnectionStatus, info.LoadName);

    //将地址值强制转换为单字节的char型,相减后得到二者之间相差几个字节
    printf("info.Addr offset %d Byte\n", (char*)&(info.Addr) - (char*)(&info));
    printf("info.ConnectionStatus offset %d Byte\n", (char*)&(info.ConnectionStatus) - (char*)(&info));
    printf("info.LoadName offs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值