然后说一下这个,基础知识 | 每日一面(16)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:为什么 sizeof 返回的值大于结构的期望值, 是不是尾部有填充?

小林:为了确保分配连续的结构数组时正确对齐, 结构可能有这种尾部填充。即使结构不是数组的成员, 填充也会保持, 以便 sizeof 能够总是返回一致的大小。

读者:如何确定域在结构中的字节偏移?

小林:ANSIC在<stddef.h> 中定义了offsetof() 宏, 用 offsetof(struct s, f) 可以计算出域 f 在结构 s 中的偏移量。如果出于某种原因, 你需要自己实现这个功能, 可以使用下边这样的代码:

#define offsetof(type, f) ((size_t) \

((char *)&((type *)0)->f – (char *)(type *)0))

这种实现不是 100% 的可移植; 某些编译器可能会合法地拒绝接受。

读者:怎样在运行时用名字访问结构中的域?

小林:保持用 offsetof() 计算的域偏移量。如果 structp 是个结构实

体的指针, 而域 f 是个整数, 它的偏移量是 offsetf, f 的值可以间接地设置:*(int *)((char *)structp + offsetf) = value;

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完