#include <stdio.h>
#define offsetof(TYPE , MEMBER)((size_t) &((TYPE *)0)->MEMBER)
//container_of是给定结构体某个成员的地址反推其结构体地址
#define container_of(ptr , type , member)({ \
const typeof(((type *)0)->member)*__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type , member));})
//#define container(ptr , type , member)(type *)((char *)ptr - offsetof(type , member)) // 返回结构体地址
#define container(ptr , type , member)(type *)((char *)ptr) //返回成员的地址
struct tag_test{
int i;
char s[32];
void *p;
};
#define print_addr(var) printf(" "#var": %p\n", var)
int main(void){
struct tag_test tstr;
struct tag_test *ca = container_of(&(tstr.p) , struct tag_test , p);
//struct tag_test *ca2 = container(&(tstr.p) , struct tag_test , p);
struct tag_test *ca2 = (struct tag_test *)((char *)&(tstr.p)); //打印p成员的地址
print_addr(&tstr);
print_addr(ca);
print_addr(ca2);
return 0;
}
c语言结构体及成员的互换,并且打印结构体地址和成员地址
最新推荐文章于 2023-09-04 14:57:37 发布