[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

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

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

相关文章

B. Burning Midnight Oil Codeforces Round 112 (Div. 2)

题目链接&#xff1a; Problem - 165B - Codeforceshttps://codeforces.com/problemset/problem/165/B 题目大意&#xff1a; 最后写了至少n个&#xff0c;每次衰减k倍&#xff08;/k&#xff09;&#xff0c;问最初的v最小为多少。 思路&方法&#xff1a; 二分答案。 AC代…

2024零废弃日青山少年可持续工坊走进南湖社区

“零废弃”不代表完全不产生任何垃圾&#xff0c;而是一种“尽可能避免产生废弃”的生活态度&#xff0c;每一个人都可以从零开始&#xff0c;从日常的随手小事开始&#xff0c;珍惜每一件物品、珍视每一种情绪&#xff0c;为生活腾出更大的空间。 2024零废弃日&#xff0c;北…

JS 表单验证

点击注册的时候&#xff0c;渲染出来&#xff0c;验证码是自动获取出来的 html&#xff1a; <div class"div1">用户名<input type"text" id"yhm"><span id"span1"></span><br>密码<input type"…

《Git版本控制管理》笔记

第三章 起步 git --version查看版本号git --help查看帮助文档裸双破折号分离参数 git diff -w master origin – tools/Makefile将当前目录或任何目录转化为Git版本库 git init 初始化之后项目目录中&#xff0c;有名为.git的文件git status 查看git状态git commit 提供日志消…

贪心算法|135.分发糖果

力扣题目链接 class Solution { public:int candy(vector<int>& ratings) {vector<int> candyVec(ratings.size(), 1);// 从前向后for (int i 1; i < ratings.size(); i) {if (ratings[i] > ratings[i - 1]) candyVec[i] candyVec[i - 1] 1;}// 从后…

格式化字符串漏洞原理及其利用(附带pwn例题讲解)

写在前面&#xff1a; 本篇博客为本人原创&#xff0c;但非首发&#xff0c;首发在先知社区 原文链接&#xff1a; https://xz.aliyun.com/t/14253?time__1311mqmx9QiQi%3D0%3DDQoDsNOfptD8nDCFdNNK4D&alichlgrefhttps%3A%2F%2Fxz.aliyun.com%2Fu%2F74789各位师傅有兴趣…

JQuery(三)---【使用JQuery动态设置浏览器窗口尺寸、JQuery的遍历】

零.前言 JQuery(一)---【JQuery简介、安装、初步使用、各种事件】-CSDN博客 JQuery(二)---【使用JQuery对HTML、CSS进行操作】-CSDN博客 一.JQuery动态设置浏览器窗口尺寸大小 1.1width()和height()方法 width()&#xff1a;设置或者返回元素的宽度(不包括内边距、边框或外…

React中的函数组件和类组件的区别

React 中的函数组件和类组件是两种不同的组件形式&#xff0c;它们之间有一些区别&#xff1a; 1、定义方式: 函数组件是一个普通的 JavaScript 函数&#xff0c;以函数的形式定义组件&#xff0c;例如&#xff1a; function FunctionComponent() {return <div>Hello,…

HTML5标签(网页编程)

一、常用标签 HTML5&#xff08;或HTML&#xff09;中有很多常用的标签&#xff0c;这些标签用于构建网页的结构和内容。以下是一些常用的HTML5标签&#xff1a; 1. 标题标签 <h1> 到 <h6>&#xff1a;定义六个级别的标题&#xff0c;<h1> 级别最高&#…

React - 你知道在React组件的哪个阶段发送Ajax最合适吗

难度级别:中级及以上 提问概率:65% 如果求职者被问到了这个问题,那么只是单纯的回答在哪个阶段发送Ajax请求恐怕是不够全面的。最好是先详细描述React组件都有哪些生命周期,最后再回过头来点题作答,为什么应该在这个阶段发送Ajax请求。那…

智慧校园预付费水电表控制系统

在智慧校园建设中&#xff0c;预付费水电表控制系统成为了不可或缺的一部分&#xff0c;它采用了先进的信息技术手段确保校园水电资源的高效管理和使用。这种系统通过智能化、信息化的手段&#xff0c;不仅优化了能源管理&#xff0c;还大幅提升了校园管理的现代化水平。本文将…

FPGA(Verilog)实现uart传输协议传输数据(含仿真)

目录 实现功能&#xff1a; 1.接收uart串行数据&#xff0c;输出并行数据(1byte)。 2.输入并行数据(1byte)&#xff0c;输出uart串行数据。 3.完成uart传输的1次环回。 uart协议的1帧数据传输 模块封装-port设置 Verilog代码实现 1.uart接收模块:接收串行数据,输出并行数…

​SCP收容物000

注 &#xff1a;本文是特别版&#xff0c;本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- Ittm # ŚČР-000 -----------------------------…

Android Q Download文件存储

11 以上 存放 Download 目录中 只能通过uri 进行读取 且只能APP 安装后存放的文件 才有访问权限 APP 卸载之后 数据库中权限会被移除 无法再通过文件名称进行查询 这边通过比较描述字段进行判断是否下载过文件 11 以上APP进行卸载后在安装下载 会出现重复文件 不知是否还有其他…

开源区块链系统/技术 总结(欢迎补充,最新)

1. FISCO BCOS FISCO BCOS 2.0 技术文档 — FISCO BCOS 2.0 v2.9.0 文档https://fisco-bcos-documentation.readthedocs.io/ 2. ChainMaker&#xff08;长安链&#xff09; 文档导航 — chainmaker-docs v2.3.2 documentationhttps://docs.chainmaker.org.cn/v2.3.2/html/in…

力扣经典150题第十一题:H指数

目录 计算研究者的 H 指数问题描述示例 解决方案排序 线性扫描 复杂度分析测试示例总结与展望结语 计算研究者的 H 指数 在本文中&#xff0c;我们将讨论如何计算研究者的 H 指数。H 指数是衡量研究者学术影响力的一种指标&#xff0c;它代表了一个研究者至少发表了几篇论文&…

行走的爬虫机器:所有可用 CSS 样式,区分可继承与不可继承。爬取自 MDN 文档!

可继承 -moz-image-region 非标准-moz-user-input 非标准 已废弃-webkit-border-before 非标准-webkit-overflow-scrolling 非标准-webkit-tap-highlight-color 非标准-webkit-text-fill-color-webkit-text-stroke-webkit-text-stroke-color-webkit-text-stroke-width-webkit-…

蓝桥杯-【二分】求阶乘

思路:对于有几个0&#xff0c;10一定会是5的整数倍&#xff0c;2的因子数一定比5的多&#xff0c;所以只要算5的个数即可&#xff0c; 30%&#xff0c;每个n都去算 #include <bits/stdc.h> using namespace std; #define ll long long ll check(ll n) { …

Java事件处理机制

一、介绍 java事件处理是采取“委派事件模型”。当事件发生时&#xff0c;产生事件的对象&#xff0c;会把此“信息”传递给"事件的监听者"处理&#xff0c;这里所说的"信息"实际上就是java.awt.event事件类库里某个类所创建的对象&#xff0c;把它称为&q…

以XX大学学生公寓为例的安科瑞远程抄表与配电能效系统解决方案【AcrelEMS-EDU校园综合能效管理】

建设背景 随着我国经济的高速发展&#xff0c;建筑能耗特别是国家机关办公建筑和大型公共建筑高耗能的问题日益突出。学校作为大型公共机构建筑的重要组成部分之一&#xff0c;其特点是占地面积大、建筑分布广、数量多、类型多样、用能情况复杂&#xff1b; 高校用能普遍问题…