你听说过柔性数组吗?

简介: 你听说过柔性数组吗?

1. 柔性数组的概念


也许你从来没有听说过柔性数组这个概念,但它确实是存在的。

C99中,结构体中的最后一个成员是允许未知大小的数组,这就叫做柔性数组成员!

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


有些编译器会报错无法编译可以改成~

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


2. 柔性数组的特点


1 .结构体中柔性数组前面必须至少含有一个其他成员~

2. sizeof计算的结构体大小不包含柔性数组的大小~

struct s
{
  int i;
  int a[];
};
int main()
{
  printf("%zd\n", sizeof(struct s));
  return  0;
}


3. 包含柔性数组的结构体用malloc函数进行内存的动态分配,并且分配的内存必须大于结构体的内存,以适应柔性数组的预期大小~

4. 一个结构体中只能含有一个柔性数组


3. 柔性数组的使用


#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
struct s
{
  int i;
  int a[];
};
int main()
{
  //printf("%zd\n", sizeof(struct s));
  struct s* p = (struct s*)malloc(sizeof(struct s) + 40);
  assert(p);//判断指针的有效性
  p->i = 100;
  for (int i = 0; i < 10; i++)
  {
    p->a[i] = i + 1;
  }
  for (int i = 0; i < 10; i++)
  {
    printf("%d ", p->a[i]);
  }
  free(p);
  p = NULL;
  return  0;
}

malloc在堆上是这样开辟空间的~


4. 柔性数组的优势


4.1上述功能的实现也可以用如下代码实现~

struct S
{
  int i;
  int* arr;
};
 
int main()
{
  struct S* pa = (struct S*)malloc(sizeof(struct S));
  assert(pa);//判断指针的有效性
  pa->i = 100;
  pa->arr = (int*)malloc(40);
  assert(pa->arr);
  for (int i = 0; i < 10; i++)
  {
    pa->arr[i] = i + 1;
  }
  for (int i = 0; i < 10; i++)
  {
    printf("%d ", pa->arr[i]);
  }
  free(pa->arr);//释放空间
  pa->arr = NULL;
  free(pa);
  pa = NULL;
  return 0;
}

以上代码在堆上是这样开辟空间的~


上面俩段代码可以实现同样的功能~


4.2但使用柔性数组却有俩个好处~


其一:方便内存释放

如果我们的代码是在一个给别人用的函数中,你在里面做了⼆次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返回给用户⼀个结构体指针,用户做⼀次free就可以把所有的内存也给释放掉。


其二:这样有利于提高访问速度

连续的内存有利于提高访问速度,也有利于减少内存的碎片化。(其实,个人觉得也没有多高了,反正你跑不了要用偏移量的加法来寻址)


相关文章
|
编解码 人工智能
脉冲压缩及MATLAB仿真(一)
脉冲压缩及MATLAB仿真(一)
1370 0
|
23天前
|
人工智能 开发者
千问AI平台 OPC 创新计划上线,百万 Token 补贴长期开放
为助推 OPC 生态、加速 AI 原生落地,千问AI平台推出长期补贴计划,一键报名即享至高200元先用后返普惠权益,提交申请可解锁至高 100 万元大额补贴,助力团队实现低成本模型调用。
200 1
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
1393 1
|
8月前
|
Web App开发 存储 NoSQL
互联网医院系统开发如何实现在线问诊与图文视频会诊
本文深度剖析互联网医院在线问诊系统的技术本质,揭示其远超IM+视频SDK的复杂性——实为“订单驱动型医疗业务系统”。从表结构设计、状态机控制、WebSocket图文通信、TRTC视频接入,到合规留痕与高并发优化,全链路拆解SpringBoot+MySQL+Redis+WebRTC技术方案,并附核心代码示例。(239字)
|
10月前
|
监控 Linux API
C#实现USB数据收发
C#实现USB数据收发
413 5
|
12月前
|
数据采集 JSON 数据可视化
用Pandas清洗爬虫数据:缺失值处理技巧全解析
爬虫数据常含缺失值,如同带泥土豆。本文用Python+Pandas演示清洗全流程:识别显性、隐性、结构缺失,结合删除、填充、模型预测等方法,将脏数据变“净数据”,助力精准分析。附实战代码与避坑指南。
695 2
|
12月前
|
人工智能 算法 安全
AI + 热成像技术在动火作业风险防控中的实现路径
融合AI视觉与热成像技术,构建动火作业安全管控体系。通过定制化易燃物识别、计算机视觉测距、红外温度监测与多源图像融合,实现风险目标精准识别、安全距离实时预警、高温火源智能捕捉,并结合小程序“即拍即查”与后端闭环管理平台,完成隐患从发现到整改的全流程追溯,提升工业现场安全管理智能化水平。
788 10
|
9月前
|
运维 Kubernetes Docker
K8s集群异常Pod高效排查命令(kube-system核心场景)
本文介绍一条专为K8s容器化集群设计的“一站式”异常Pod排查命令。它通过`docker exec`进入K8s核心容器,执行`kubectl get pod -A`并反向过滤正常状态(如1/1、2/2),快速定位`kube-system`等关键命名空间中就绪异常的Pod,解决步骤繁琐、筛选低效、覆盖不全三大运维痛点,支持巡检、应急、变更验证等场景。(239字)
546 0
K8s集群异常Pod高效排查命令(kube-system核心场景)
|
10月前
|
数据采集 人工智能 文字识别
降低AI幻觉,破解非结构化数据之困:司马阅自研模型DocMind-V3.0加速重塑企业数据价值
数字经济时代,数据是企业的核心竞争力,80%以上的企业数据深藏于制度、合同、报表、标书、扫描件等各类文档中。这些非结构化“沉默数据”如未被开采金矿,因无法被机器直接理解、调用,成为企业AI落地的“堵点”。 大语言模型为处理这类数据提供新可能,但企业在AI落地过程中,常常被AI幻觉“绊住”:大语言模型会“自信地犯错”,会“帮你凑一个看似合理的答案”,即大模型会基于模糊信息生成偏离事实的内容,导致数据应用失真,无法支撑精准决策与合规要求,其根本原因在于输入数据质量太低。 数据处理遵循“GIGO(垃圾进垃圾出)”原则,低质量无规范输入,再强的模型也难输出可靠结果。
392 7
|
11月前
|
人工智能 自然语言处理 安全
技术人办活动不用慌,这个AI指令帮你搞定完整策划案
技术人办活动头疼?用AI指令轻松生成完整策划案!覆盖目标分析、流程设计、预算风控等八大模块,适配沙龙、发布会等多种场景。结合国产AI工具,30分钟搞定专业方案,助力开发者高效落地活动。
1337 2

热门文章

最新文章