萌晓二
楼主
发布于 2023-4-19 17:03:02
阅读 858
查看全部
目录
什么是柔性数组
柔性数组是在C99中定义的
构造体的最后一个元素允许是未知大小的数组,这就叫柔性数组
柔性数组的长度可以写成0,也可以不规定数组长度
下面两种写法都是正确的
struct S
{
int i;
int a[0];//柔性数组成员
}
struct S
{
int i;
int a[];//柔性数组成员
}
构造体中的柔性数组成员前面至少有一个其他成员sizeof返回的这种构造体的大小不包括柔性数组的大小包含柔性数组成员的构造体用malloc ()函数停止内存的动态分配,并且分配的内存应该大于构造的大
小,以适应柔性数组的预期大小。
柔性数组的使用
typedef struct S
{
int i;
char c[];//c是柔性数组
}S;
int main()
{
S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
if (p == NULL)
{
perror("malloc");
return 1;
}
p->i = 10;
for (int i = 0; i < 10; i++)
{
p->c = 'a';
}
free(p);
p = NULL;
return 0;
}
在malloc开拓空间时,开拓空间大小为sizeof(S) + 10 * sizeof(char),前面的sizeof(S)其实是表示构造体中int i的大小,后面则是给c开拓了10个字节大小的连续空间
假设觉得前面开拓空间小了,数组c不够长,还可以用realloc函数对内存大小停止调整
int main()
{
S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
if (p == NULL)
{
perror("malloc");
return 1;
}
p->i = 10;
S* ptr = (S*)realloc(p, sizeof(S) + 20 * sizeof(char));
if (ptr == NULL)
{
perror("realloc");
return 1;
}
p = ptr;
for (int i = 0; i < 20; i++)
{
p->c = 'a';
}
free(p);
p = NULL;
return 0;
}
其实我们也可以写出另一种形式的构造体,它的功能与柔性数组类似
typedef struct S2
{
it i;
char* c;
}S2;
对于这个构造体的使用如下:
int main()
{
S2* p = (S2*)malloc(sizeof(S2));
p->i = 10;
p->c = (char*)malloc(10 * sizeof(char));
for (int i = 0; i < 10; i++)
{
p->c = 'a';
}
free(p->c);
p->c = NULL;
free(p);
p = NULL;
return 0;
}
为了使用这个构造体,需要先给构造体开拓一个空间S2* p = (S2*)malloc(sizeof(S2));然后再需要动态开拓一个块空间让c指向
这种写法需要开拓2次内存,同样在最后释放内存是,也需要free2次
所以就可以看出柔性数组的好处:
第 一个是方便内存释放
因为不论是我们在使用时或给他人写一个函数让他人使用时,假设在里面做了二次内存分配,可能他人使用时并不会晓得构造体内部还有一个成员需要释放。所以就需要把内存一次性分配好,在最后释放一次内存就可以了
第二个是加快访问
假设二次内存分配,就会在内存中产生一些内存碎片,这样即浪费了空间也不利于访问
到此这篇关于深化理解一下C语言中的柔性数组的文章就介绍到这了,更多相关C语言柔性数组内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!