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

C语言 专栏收录该内容
3 篇文章 0 订阅

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



一、问题背景

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


二、代码

#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;  
}

三、说明

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


  • 3
    点赞
  • 1
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值