sturct的一些写法 收集中。。。

这些写法只在linux下实现过 win32没试过,如果有新的写法,希望大家给我留言 谢谢!
#define NUM 10
typedef struct _example_struct {
    int start;
    int size;
    int used;
} example_struct;

 

1  有点像数组赋值

example_struct tmp = {0};   //相当于memset(&tmp, 0, sizeof(example_struct))

 

2 有点怪 内核和驱动的代码里面经常这样写

example_struct tmp = {

        .start = 0,
        .size = 0,
        .used = 0
 };  //里面的成员位置可以随便换的

 

3 这个更怪,传说bootloader里面的 stage2部分就是这样写的

example_struct memory_map[5] = {
    [0 ... 4] = {
        .start = 0,
        .size = 0,
        .used = 0
    },
};

 

我试了一下,还可以这样

example_struct memory_map[10] = {
    [0 ... 4] = {
        .start = 1,
        .size = 1,
        .used = 1
    },

    [5 ... 9] = {
        .used = 2,
        .size = 2,
        .start = 2
    },

};

 

4 另外还有一招计算一个struct中个成员到struct首地址偏移量的,当然这个偏移量已经考虑到了内存对齐问题

这种写法用于如果外界(如函数传参)只传了某个结构体的成员变量的地址,我们可以由这个地址获得整个结构体的信息,当然前提是这个结构体没有被封装掉

container_of宏就是做这个的

 

#define NUM 0

size_t offset = (size_t) (& ( (example_struct*)NUM )->memberName )

这个其实就是以数字NUM为首地址构造一个结构体,然后在取结构体里面某个元素的地址

offset - NUM 的值就是某个成员到首地址的偏移量,NUM为0 的话 offset就是偏移量

 

example_struct  start : size = (size_t) (& ( (example_struct*)0 )->start )

example_struct  start : used = (size_t) (& ( (example_struct*)0 )->used )

example_struct  start : size = (size_t) (& ( (example_struct*)0 )->size )

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值