C语言深度解剖笔记2之柔性数组和动态数组

柔性数组是c99引进的,在c99中,结构体的最后一个成员我们允许是未知大小的数组,这个数组我们就叫做柔性数组,而且在这个柔性数组之前必须有至少一个其他成员。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用
malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构体内存的大小,以适应柔性数组的预期大小。

如下:

typedef struct st_type
{
int i;
int a[];
}type_a;

这样我们的结构体大小就是不唯一的,用sizeof(type_a) 得到的只有4 , 就是sizeof(i)=sizeof(int)。

,而后我们可以进行变长操作了。通过如下表达式给结构体分配内存:

type_a *p=(type_a*)malloc(sizeof(type_a)+sizeof(int));这样我们为结构体指针p 分配了一块内存,不过需要说明的是sizeof(*p)的大小(即结构体的大小)仍然是4,因为我们定义这个结构体的时候,我们自定义的类型type_a的大小已经确定了4,动态申请的内存只是申请给数组拓展所用。创建之后,利用p->array[]来访问每一个值

柔性数组有什么用途 ?

它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。

怎么使用:

在结构体中最后一个成员写为一个长度为空的数组,如int arr[ ];这个数组是不占用内存的,而且在这个数组前面至少添加一个别的成员。

像柔性数组这种变长数组常用于网络通信中构造不定长数据包,不会浪费空间浪费网络流量,比如我要发送1Kb字节的数据,如果用定长包,假设定长包的长度为2048字节,就会浪费1024个字节的空间,也会造成不必要的流量浪费。关于这个数据包可以详见博客园之C语言柔性数组和动态数组。

动态数组与柔性数组的区别是后者依靠结构体,基本上柔性数组和动态数组的创建是差不多的。

动态数组及时数组大小可以随时变化,需要用到realloc函数,指针和malloc,创建如下:

int *a = (int*)malloc(10*sizeof(int));那么 a就相当于一个有10个元素的数组,利用
    a = (int*)realloc(a, 20*sizeof(int));//意思是把a的大小增加到20,而保持原来已有的数据不变。
头文件:#include<stdlib.h> #include<malloc.h> 或#include<alloc.h>

猜你喜欢

转载自blog.csdn.net/woainilixuhao/article/details/86540140