一、问题背景
日常工作中没有编程的机会,所以只看得懂代码,现在需要重新写一段代码,实现固定格式存储数据,需要使用到结构体和结构体指针。数据个数是非固定的,编写过程中用结构体指针会更方便,在使用结构体中的结构体指针时出现了很多问题。
下面直接上代码,避免以后编程中使用结构体指针出现错误。
二、代码
#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;
}
三、说明
以上的注释并不代表说法完全正确,只是我一点点编程测试个人摸索的结果,所以如果有说的不合理的或者错误的地方,希望看到的人指出来。
一直都没找到能将这类用法的书,如果有大佬看到了,希望留个书名我学习学习~~~