c语言结构体指针

人类成功地让我再也不喜欢结构体了。久久和人类一样讨厌了,你们没事为什么要写指针,没事为什么要写指针,:(

 
 
 
/*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上,



猜你喜欢

转载自blog.csdn.net/zuoside__lord/article/details/80205946