这些写法只在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 )