在结构体中,可以定义长度为零的数组,在堆区上开辟空间时,可以根据所需要的空间向内存申请。
以上两种写法都可以;
struct S* ptr = (struct S*)malloc(sizeof(struct S)); 此时编译器计算出的大小只有4字节,不包括结构体成员中的数组arr; 我们根据实际需求再向系统申请空间;这里举例:需要 40个字节存储10个整型值,代码实现为: (struct S*)ptmp = (struct S*)realloc(sizeof(struct S)+sizeof(int)*10); if(ptmp!=NULL); ptr=ptmp; 此时,结构体指针ptr指向新空间(空间大小为4+40=44节);
注意使用场景为:在堆区开辟空间用作存储数据!
**************************************************************************************************************
以上功能我们可以以另一种方法来实现: 定义一个结构体,成员可以是 int num;int* arr;
此种方法完全可以实现上面的功能,唯一的区别就是 多一次使用malloc()函数; 代码实现如下:
struct S* ptr = (struct S*)malloc(sizeof(struct S));
int* ptmp = (int*)malloc(sizeof(int*10));
if(ptmp!=NULL) ptr->arr = ptmp;
说明:① 在堆区申请结构体存储空间
②在堆区申请结构体中数组的空间,空间大小根据需求申请
③、④是结构体中数组的空间不够用,重新根据需求申请后使用
总结:个人想法是此两种方法都可解决实际问题,重点是理解过程。
第一种方法 只需释放一次
第二种方法 需要连续释放两次 ,容易出现内存泄漏;
使用数组访问存储的数据快速。 减少内存碎片是大佬们的认知,对于目前的我,只能是记 住,还体会不到那一层次的免用,路漫漫其修远兮,只能站在大佬们的肩膀上学习!