用结构体指针访问结构体中的结构体指针(结构体指针的嵌套)

结构体中的结构体指针是使用



一、问题背景

  日常工作中没有编程的机会,所以只看得懂代码,现在需要重新写一段代码,实现固定格式存储数据,需要使用到结构体和结构体指针。数据个数是非固定的,编写过程中用结构体指针会更方便,在使用结构体中的结构体指针时出现了很多问题。
  下面直接上代码,避免以后编程中使用结构体指针出现错误。


二、代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>    

#define OFFSET_NUM 3 //结构体指针偏移次数

typedef struct
{
    char str_a[20];
    double lf;
}A;//声名一个结构体类型A

typedef struct 
{
    char str_b[20];
    A *pa;
}B;//声名一个结构体类型B,其中包含一个A类型的结构体指针

void print_A(A *a)//用来打印结构体中的数据
{
    printf("a->str_a=%s\n",a->str_a);
    printf("a->lf=%2.3f\n",a->lf);
}

int main(int argc, char *argv[])  
{   
    B *pb=(B *)malloc(sizeof(B));//先申请结构体指针的内存空间大小,此时编译器不会分配结构体内结构体指针的地址。
    pb->pa=(A *)malloc(sizeof(A)*OFFSET_NUM);//再申请结构体中的结构体指针内存空间大小,顺序反了将提示无法识别pb;内存空间一定要等于乘以需要使用的数量,否则数据可能会出错。

    int i;
    for(i=0;i<OFFSET_NUM ;i++)
    {
        strcpy(pb->pa->str_a,"string_A");//赋值
	    pb->pa->lf=50.2+i;//赋值
        print_A(pb->pa);//将结构体指针pa地址作为参数输出打印信息
	    pb->pa++;//移动到下一个大小为A的内存空间,相当于定义了一个结构体数组a[3](但是并不是)
    }
    pb->pa-=OFFSET_NUM ;//恢复指针指向的地址位置,否则free()释放空间时会报错,错误提示为:
                        //munmap_chunk(): invalid pointer: //原因是释放的没有申请过的内存

    free(pb->pa);//先释放结构体内部的结构体指针
    free(pb);//再释放结构体指针
    return 0;  
}

三、说明

  以上的注释并不代表说法完全正确,只是我一点点编程测试个人摸索的结果,所以如果有说的不合理的或者错误的地方,希望看到的人指出来。
  一直都没找到能将这类用法的书,如果有大佬看到了,希望留个书名我学习学习~~~


  • 11
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Conrad_Feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值