1.柔性数组方法
结构体所占内存空间为4个字节,int arr[0]不占内存空间大小。利用malloc将开辟24个连续字节的空间,并将地址交由struct s ps*来维护。
但24个字节空间不够使用时,利用realloc扩大内存空间至44字节。在判断新开辟空间的指针是否为空指针,最后只要释放一次。
#include<stdio.h>
#include<stdlib.h>
struct s
{
int n;
int arr[0];
};
int main()
{
struct s* ps = (struct s*)malloc(sizeof(struct s) + 5 * sizeof(int));
ps->n = 10;
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
struct s* ptr = realloc(ps, 44);
if (ptr != NULL)
{
ps = ptr;
}
for (i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
printf("\n");
free(ps);
ps = NULL;
}
2.等价替代柔性数组
此时结构体里面创建二块内存,并不连续。
struct s
{
int n;
int* arr;
};
先用malloc创建整体内存空间交由指针struct sps来维护,在用int指针来开辟新的内存空间。
struct s* ps = (struct s*)malloc(sizeof(struct s));
ps->arr = malloc(5*sizeof(int));
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
空间不足时,利用realloc开辟新的内存空间。
int* ptr = realloc(ps->arr,10*sizeof(int));
if (ptr != NULL)
{
ps->arr = ptr;
}
for (i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ",ps->arr[i]);
}
最后释放内存空间,先ps->arr释放,其包含在指针ps所维护的空间,所以先释放ps->arr开辟的空间,在释放ps所指向的空间。
free(ps->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
3.柔性数组的优点:
一、方便内存的释放
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用 户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发 现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体 指针,用户做一次free就可以把所有的内存也给释放掉。
二、提高访问速度
连续的内存有益于提高访问速度,也有益于减少内存碎片。
github源码(https://github.com/bijian0530/CSDN)