当前位置: 首页 > news >正文

[C语言]——柔性数组

目录

一.柔性数组的特点

二.柔性数组的使用

三.柔性数组的优势


C99中,结构体中最后⼀个元素允许是未知大小的数组,这就叫做『柔性数组』成员。

typedef struct st_type //typedef可以不写
{ int i;int a[0];//柔性数组成员 
}type_a;

有些编译器会报错⽆法编译可以改成:

typedef struct st_type
{int i;int a[];//柔性数组成员 
}type_a;

一.柔性数组的特点

  • 结构中的柔性数组成员前⾯必须至少⼀个其他成员。
  • sizeof返回的这种结构大小不包括柔性数组的内存。
  • 包含柔性数组成员的结构⽤malloc()函数进内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

 只计算n的内存大小,计算柔性数组前的内存

例如:

typedef struct st_type
{int i;int a[0];//柔性数组成员 
}type_a;int main()
{printf("%d\n", sizeof(type_a));//输出的是4 return 0;
}

二.柔性数组的使用

//代码1 
#include <stdio.h>
#include <stdlib.h>
int main()
{int i = 0;type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));//业务处理 p->i = 100;for(i=0; i<100; i++){p->a[i] = i;}free(p);p=NULL;return 0;
}

这样柔性数组成员a,相当于获得了100个整型元素的连续空间

三.柔性数组的优势

上述的 type_a 结构也可以设计为下⾯的结构,也能完成同样的效果。

//代码2 
#include <stdio.h>
#include <stdlib.h>
typedef struct st_type
{int i;int *p_a;
}type_a;
int main()
{type_a *p = (type_a *)malloc(sizeof(type_a));p->i = 100;p->p_a = (int *)malloc(p->i*sizeof(int));//业务处理 for(i=0; i<100; i++){p->p_a[i] = i;}//释放空间 free(p->p_a);p->p_a = NULL;free(p);p = NULL;return 0;
}

上述代码1和代码2可以完成同样的功能,但是⽅法1的实现有两个好处:

  • 第⼀个好处是:⽅便内存释放如果我们的代码是在⼀个给别⼈⽤的函数中,你在里面做了⼆次内存分配,并把整个结构体返回给用户。用户调⽤free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能 指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返 回给用户⼀个结构体指针,用户做⼀次free就可以把所有的内存也给释放掉。
  • 第⼆个好处是:这样有利于访问速度.连续的内存有益于提⾼访问速度,也有益于减少内存碎片。(其实,我个⼈觉得也没多⾼了,反正你跑不了要⽤做偏移量的加法来寻址)

扩展阅读:C语言结构体里的成员数组和指针 | 酷 壳 - CoolShell

相关文章:

  • AtCoder Beginner Contest 348 A~F
  • 基于拉格朗日分布算法的电动汽车充放电调度MATLAB程序
  • Android 事件分发
  • 美团一面4/9
  • 记Kubernetes(k8s):访问 Prometheus UI界面:Warning: Error fetching server time
  • 10. TypeScript面向对象的类(Class)
  • vue2转vue3一些属性使用方法总结 (持续更新中)
  • MySql并发事务问题
  • winform datagridView 一次删除20000条数据
  • SpringBoot快速入门笔记(5)
  • GPT提示词分享 —— 中医
  • mysql中表的设计
  • 帝国CMS模板源码整站安装说明(图文)
  • APIFY集成客服系统:提升用户运营效率
  • 技术 SEO 初学者指南
  • [译]如何构建服务器端web组件,为何要构建?
  • 【EOS】Cleos基础
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【技术性】Search知识
  • ES学习笔记(12)--Symbol
  • Flex布局到底解决了什么问题
  • Mac转Windows的拯救指南
  • Ruby 2.x 源代码分析:扩展 概述
  • SAP云平台里Global Account和Sub Account的关系
  • sublime配置文件
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 简单易用的leetcode开发测试工具(npm)
  • 前端性能优化——回流与重绘
  • 如何利用MongoDB打造TOP榜小程序
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • elasticsearch-head插件安装
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • zabbix3.2监控linux磁盘IO
  • ​Linux·i2c驱动架构​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • (1) caustics\
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)Linux Shell编程——输入输出重定向
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)程序员技术练级攻略
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .net 4.0发布后不能正常显示图片问题
  • .Net Core与存储过程(一)
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net8 Blazor 尝鲜
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET与 java通用的3DES加密解密方法
  • @property python知乎_Python3基础之:property
  • [2016.7.Test1] T1 三进制异或