人类成功地让我再也不喜欢结构体了。久久和人类一样讨厌了,你们没事为什么要写指针,没事为什么要写指针,:(
/*author:久久*/
#include<stdio.h> #include<stdlib.h> #pragma pack(push,1) struct s1 { int a; struct { int ba; int bb; }*b; }; #pragma pack(pop)//内存对齐这玩意,你们自己去搜 static void * _alloc(void) { void *p=malloc(sizeof(int)+sizeof(void *));//申请内存 一个整形+一个结构体指针 *(( void** )p+1)=malloc(2*sizeof(int));//p偏移4个字节后就是结构体指针啦,申请结构体指针里内容内存 printf("Entry = %p\n",p); return p; } static void _fill(void *p) { *(( int* )p)=1;//将结构体首地址p强制转换成int*指针后解地址 然后将1赋值给它 *( int* )(*(( void** )p+1))=2;//首先将p强制转换成二级指针然后+1【即偏移4个字节】 得到结构体里面那个结构体b的地址【这里还是一个二级指针】然后通过一次解地址才是结构体b首地址,然后将这个首地址强制转换成int*,然后解地址 ,再把2赋值给它 *(( int* )(*(( void** )p+1))+1)=3;//这个是在结构体里的结构体b首地址基础偏移4字节 然后再解地址 } static void _read(struct s1 *p) { printf("%d\n",p->a); printf("%d\n",p->b->ba); printf("%d\n",p->b->bb); } int main() { struct s1* p; p = _alloc(); _fill(p); _read(p); return 0; }
1.c里竟然也有可变参数 来自久久别的代码,
久久说:指针有两个重点,一个是指针大小 一个是偏移量
久久说:所以强制转型的目的就是让偏移量和原来数据相匹配~
2.gcc -S filename 转换为汇编代码 我今天才第一次看见c语言转换为汇编代码在msys2上,