二重指针、offsetof、container_of宏测试
#include <stdio.h>
#define OFFSETOF(TYPE, MEMBER) ( (int) &(((TYPE *)0)->MEMBER) )
#define CONTAINER_OF(PTR,TYPE,MEMBER) \
({ \
const typeof(((TYPE *)0)->MEMBER) * _P = (PTR); \
(TYPE *)((char *)_P - OFFSETOF(TYPE,MEMBER)); \
})
struct Student
{
char a;
int b;
short c;
char d;
};
int main()
{
int a = 12;
int b = 13;
int c = 14;
int d = 15;
int *pInt[] = {&a, &b, &c ,&d};
int **pINT2 = pInt;
char *pChar[] = {"ni","hao","bu","ma"};
char *(*pCA)[] = &pChar;
char **pCHA = (char **)pCA;
printf("%s.(ni)\n",*pCHA);
printf("%s.(hao)\n",*(pCHA+1));
printf("%s.(bu)\n",*(pCHA+2));
printf("%d.(12)\n",*(*pINT2));
printf("%d.(13)\n",*(*(pINT2+1)));
printf("\n偏移量测试.\n");
printf("%d.(4)\n",OFFSETOF(struct Student,b));
printf("%d.(8)\n",OFFSETOF(struct Student,c));
printf("%d.(10)\n",OFFSETOF(struct Student,d));
printf("\n首地址测试.\n");
struct Student stu;
stu.c = 12;
struct Student *p = CONTAINER_OF(&(stu.c),struct Student,c);
printf("p1 = %p, p2 = %p.\n",&stu,p);
return 0;
}