(int)&(((Student*)0)->age) 上述获取的就是Student结构体中 , age 成员的偏移量 ;
宏功能:获得一个结构体变量成员在此结构体中的偏移量。 1. ( (TYPE *)0 ) 将零转型为TYPE类型指针; 2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址,即相对于0的偏移量,要的就这个; 4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型,...
inta ='a';char*p = (char*)&a;//&a就是一个整数,代表局部变量a的地址,p也等于这个地址值,只是指向的是char类型 所以上面的宏首先将0强制转换为结构体的指针,指向的地址为0。'&(((struct_name *)0)->struct_member)'即为元素的地址,偏移量为元素地址减去结构体首地址(这里为0),最后转换为无符号整型。
int,char*都是4字节的,该结构体按4字节对齐。存储的时候是这样的:第一个4字节,存放int型的age 第二个4字节,存放数组name的前4个元素 第三个4字节,第一个字节存放name的第5个元素,后面3个字节填充不用 第四个4字节,存放char *型的app。所以app的偏移量就是3个4字节,共12字节。详细的...
一、指针运算 与 指针内存操作 二、结构体偏移量计算 一、指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等运算 , 其效果等同于 对 int 整型变量 进行 算术运算 , 编译运行 并不会报错 ; ...
&((type *)0)->member:取type类型指针变量的成员member的地址,因为起始地址为0,所以&((type *)0)->member取到的就是member成员相对与结构体变量的首地址偏移量; 2.2.container_of /** * @brief container_of:知道结构体中某个元素的指针(ptr),反推这个结构体变量(ptr所在的变量)的指针(首地址),继而得到...