柔性数组详解

news2024/9/27 21:28:01

柔性数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2pzgy9xY-1692596782928)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230821131511106.png)]

1.前言

在c99标准中:允许结构体的最后一个变量是未知大小的数组,这就是柔性数组的来源。

例如:

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

有些编译器可能会报错,那就使用下面这一种定义方式:

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

2.特点

柔性数组的特点:

  • 结构体中的柔性数组成员之前必须至少有一个其他成员。
  • sizeof计算包含柔性数组的大小时, 是不包含柔性数组的大小的。
  • 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

例如:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct type_a {
    int i;
    int a[];
}type_a;

int main()
{
    printf("%d ", sizeof(type_a));
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LM2o7kXa-1692596782929)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230821131843080.png)]

3.使用

又例如:(在位柔性数组开辟空间时,sizeof计算的是除了柔性数组之外的元素的大小,接着+后面的就是为柔性数组所开辟的内存空间的大小)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct type_a {
    int k;
    int a[];
}type_a;

int main()
{
    //printf("%d ", sizeof(type_a));
    type_a* tmp = (type_a*)malloc(sizeof(type_a) + 40);
    for (int i = 0; i < 10; i++)
    {
        tmp->a[i] = i + 1;
        printf("%d\n", tmp->a[i]);
    }
    free(tmp);//释放所开辟的空间
    tmp = NULL;
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDeMsIyu-1692596782930)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230821132709401.png)]

4.优势

以上的柔性数组也可以设置成一下这种格式:

typedef struct st_type
{
    int i;
    int *p_a;
}type_a;
    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;

注意:这种实现方式是先为结构体开辟内存空间,接着为结构体中的指针变量开辟空间。总共要开辟两次空间,很麻烦。最后释放空间时,还需要要先释放柔性数组的空间,再释放结构体的空间。

两种实现方式的对比:

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

前者更利于访问速度:连续的内存有益于提高访问速度,也有益于减少内存碎片。

4.完结

柔性数组的全部内容就到这里啦,若有不足,欢迎评论区指正,下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据驱动洞察:各种词频分析技术挖掘热点数据

一、引言 随着信息时代的发展&#xff0c;人们的关注点日益复杂多样。社交媒体、新闻网站和论坛等平台上涌现了大量的信息&#xff0c;这使得热点分析成为了解社会热点话题和舆情动向的重要手段。词频统计是热点分析的基础&#xff0c;本文将分别介绍基于ElasticSearch、基于S…

C++动态规划经典案例解析之合并石子

1. 前言 区间类型问题&#xff0c;指求一个数列中某一段区间的值&#xff0c;包括求和、最值等简单或复杂问题。此类问题也适用于动态规划思想。 如前缀和就是极简单的区间问题。如有如下数组&#xff1a; int nums[]{3,1,7,9,12,78,32,5,10,11,21,32,45,22}现给定区间信息[…

中国区域地表净辐射数据集(1982-2017)

摘要 地表净辐射(Rn) 是陆地生态系统水、热、碳循环过程中的重要参数,准确地估算Rn并分析其时空变化特征对气候变化和能量平衡等研究具有重要意义。本文基于CMFD再分析资料和GLASS地表反照率数据集估算1982~2017年中国区域逐日Rn。本数据集将逐日Rn统计为每月Rn,空间分辨率…

诚迈科技携数智成果亮相南京软博会,交出数实融合圆满答卷

8月20-23日&#xff0c;南京软博会在南京国际博览中心盛大举行。诚迈科技聚焦数字中国建设需求和万物智联时代关键软件技术发展趋势&#xff0c;全方位展示了一系列操作系统产品和数智化解决方案成果&#xff0c;旨在推动数实融合创新。此外&#xff0c;诚迈科技受邀出席中国工…

【业务功能篇74】三高微服务项目springboot-springcloud

三高指的是&#xff1a;高性能、高并发、高可用 2.项目架构 2.1 系统架构图 整体的项目架构图如下 2.2 业务组成 整体的项目业务组成如下

Elasticsearch简介及安装

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

指针与引用详解

博文内容&#xff1a; 指针与引用 指针和引用的区别&#xff1f; 这个问题主要还是仁者见仁&#xff0c;智者见智。 主要就是对于俩者的出现时间来看&#xff0c;对于指针来说&#xff0c;早在C语言那会就已经出现&#xff0c;C是后于C语言的&#xff0c;所以C的出现会多少在使…

美创科技“签”手柠檬文才学堂,共推高校数据安全建设

近日&#xff0c;由柠檬文才学堂联合中国教育在线、东北财经大学网络教育学院共同主办的“三教统筹下高校继续教育数字化转型研讨”顺利召开。 国内高等院校&#xff08;高职院校&#xff09;继续教育分管领导&#xff0c;继续教育学院领导及继续教育信息化、教学教务管理、课程…

❤ 给自己的mac系统上安装java环境

❤ 给自己的mac系统上安装java环境 &#x1f353; 作为前端工程师如何给自己的mac系统上安装java环境 &#x1f34e; 最近因为自己的一些项目需求&#xff0c;mac电脑上需要安装一些后台的java环境&#xff0c;用来跑后台的java程序&#xff0c;于是从一个前端工程师的角度安…

00-音视频-概述

有很多场合会使用的音视频&#xff0c;比如安防、视频闸机、影音播放器、视频通话&#xff0c;短视频等等。 从摄像头采集到用户观看&#xff0c;这中间涉及到了很多技术。 用户一般观看的高清视频1080P30帧。若按24位RGB对视频进行存储&#xff0c;一个60分钟视频所占空间 …

IBM Spectrum LSF Data Manager

IBM Spectrum LSF Data Manager 当需要大量数据来完成计算时&#xff0c;您的应用程序最好不受阻碍地访问与应用程序执行环境相关的数据位置所要求的数据。 LSF Data Manager 通过将所需数据 登台 以尽可能接近应用程序站点来解决数据局部性问题。 许多应用在几个领域需要大量…

在Linux系统中配置代理服务器来加速软件包管理

作为一名专业程序员&#xff0c;我今天要和大家分享一个在Linux系统中配置代理服务器来加速软件包管理的解决方案。如果你经常在Linux上使用软件包管理器&#xff08;如apt、yum等&#xff09;&#xff0c;但下载速度缓慢&#xff0c;那么本文将给你带来一些操作方法&#xff0…

《基础教育论坛》期刊简介及投稿要求

《基础教育论坛》杂志是经国家新闻出版总署批准、国内外公开发行的综合性教育学术期刊。作者可通过&#xff0c;中华人民共和国新闻出版总署的网站进行出版许可及刊号的查询。 2009年&#xff0c;《基础教育论坛&#xff08;综合版&#xff09;》杂志创刊。 2012年&#xff0…

电阻计算公式

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口

Powershell NTP Server Windows 7,8,10,11,2012,2016,2019,2022

NTP前言 NTP服务器是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟、GPS等)做同步化,提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议1。 ntp 参考 w32tmpowershell参考 参考…

激光雷达的「新」难题

车载激光雷达赛道正在进入关键时刻。 本周&#xff0c;又一家造车新势力—极石汽车旗下首款车型极石01正式对外发布&#xff0c;高阶智驾配置三颗来自禾赛的激光雷达&#xff0c;包括1个128线前向激光雷达和2个侧向纯固态激光雷达。 在此之前&#xff0c;中国市场已经量产交付的…

探索归并排序:分而治之的排序艺术

1. 引言&#xff1a;排序算法的重要性与背景 排序是计算机科学中的基础问题之一&#xff0c;它在各种应用中都得到了广泛的应用&#xff0c;从搜索引擎到数据库管理系统。而归并排序&#xff08;Merge Sort&#xff09;作为一种经典的排序算法&#xff0c;通过分治法的思想&am…

Python“牵手”京东工业商品详情数据采集方法,京东工业商数据API申请步骤说明

京东工业平台介绍 京东工业平台是京东集团旗下的一个B2B电商平台&#xff0c;主要面向企业客户提供一站式的采购服务。京东工业平台依托京东强大的供应链和配送能力&#xff0c;为企业用户提供全品类、全渠道、全场景的采购解决方案&#xff0c;涵盖电子元器件、机械配件、办公…

smartbi token回调获取登录凭证漏洞

2023年7月28日Smartbi官方修复了一处权限绕过漏洞。未经授权的攻击者可利用该漏洞&#xff0c;获取管理员token&#xff0c;完全接管管理员权限。 于是研究了下相关补丁并进行分析。 0x01分析结果 依据补丁分析&#xff0c;得到如下漏洞复现步骤 第一步&#xff0c;设置Engi…

java开源 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 小程序商城搭建 bbc

​ 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前…