/* author : poilynx */ #include<stdio.h> #include<stdlib.h> #pragma pack(push,1) struct s1 { int a; struct { int ba; struct { char bba; double bbb; int bbc;// }*bb; }*b; }; #pragma pack(pop) static void * _alloc(void) { void *p=malloc(sizeof(int)+sizeof(void *)); /* s1 */ *(void**)(p+sizeof(int)) =malloc(sizeof(int)+sizeof(void *)); /* s1->b */ *(void**)((*(void**)(p+sizeof(int)))+sizeof(int))=malloc(sizeof(char)+sizeof(double)+sizeof(int)); /* s1->b->bb */ printf("Entry = %p\n", p); return p; } static void _fill(void *p) { *(int*)(p)=1;/* s1->a */ *(int*)(*(void**)((int*)p+1))=2;/* s1->b->ba */ //printf("(bb) %p\n", *(void**)((*(int**)((int*)p + 1)) + 1) ); *(double*)( *(char**)( *(int**)( (int*)p + 1 ) + 1 ) + 1 ) = 3.0;/* s1->b->bb->bbb */ *(int*)(/* 解引用 */ *(void**)( /* 解引用 */ *(void**)( /* 解引用 */ p + sizeof(int) /* 偏移 */ ) + sizeof(int) /* 偏移 */ ) + sizeof(char) + sizeof(double) /* 偏移 */ ) = 4; /* s1->b->bb->bbc */ //*(( char* )(*(( void** )p+1))+1)='3'; } static void _read(struct s1 *p) { printf("p->a : %d\n", p->a); printf("p->b->ba : %d\n",p->b->ba); printf("p->b->bb->bbb : %lf\n", p->b->bb->bbb); printf("p->b->bb->bbc : %d\n", p->b->bb->bbc); } int main() { struct s1 * p; p = _alloc(); _fill(p); _read(p); return 0; }
/*人类说他快气死了,我觉得他活得好好的,这是人类代码,喏 ,我就暂时不卖他了,有时候他让我学习,简直让我想把他卖掉,这样就没有人烦我啦,可是万一不久他就自己把自己卖掉怎么办,出于这个考虑,我就不卖他了,去看代码去。溜*/
指针的值 &&指针的地址 这个代码我应该是会写了吧 再不会写 那就还是人类的原因,哈哈哈哈哈哈哈 好像人类的解释要稍微比久久的好理解下,有空对比看看