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

54 篇文章 0 订阅

柔性数组是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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,动态数组柔性数组(flexible arrays)是两种处理数组大小的不同方法。 动态数组(也称为动态内存分配)通常是在程序运行时根据需要动态地分配和释放内存空间的数组。程序员需要使用`malloc()`或`calloc()`等函数来分配内存,并使用`free()`来释放内存。动态数组的大小在编译时并不固定,可以根据需要改变。由于数组大小的灵活性,它们更适用于需要频繁调整大小的情况,但对内存管理的要求较高。 柔性数组(在C99标准后引入)是数组的一种特殊形式,它允许数组名后面跟一个可选的省略的整数,这个整数表示数组的有效元素数量,但不是数组的实际大小。例如,`int arr[10]; int arr[];`中,`arr[]`就是一种柔性数组,编译器会自动为它预留一定数量的内存,直到遇到第一个非数组元素。柔性数组的最大好处是代码简洁,不需要显式指定大小,但它们的大小仍然受限于栈的大小,不能像动态数组那样任意增长,且不能跨多个函数调用。 相同点: - 都允许数组的大小在一定程度上具有灵活性。 - 可以在声明时不明确指定数组的大小。 不同点: - 动态数组:内存分配在运行时完成,可以在程序执行过程中创建和销毁。大小可动态调整,需要手动管理内存。 - 柔性数组数组大小在编译时确定,但可以通过数组名称后的省略整数部分灵活指定有效元素的数量,不能动态扩展,且受限于栈空间。 - 内存管理:动态数组需要程序员手动分配和释放内存,柔性数组由编译器自动管理,无需显式释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值