C语言之动态内存管理_柔性数组篇(2)

目录

柔性数组的特点

柔性数组的使用 

动态内存函数增容柔性数组模拟实现 

柔性数组的优势


今天接着来讲解一下柔性数组知识。

柔性数组的特点

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

  • 结构体中
  • 最后一个成员
  • 未知大小的数组【柔性数组】
struct Stu
{char c;int i;int arr[];//也可以这样写int arr[0]//未知大小的数组 -柔性数组成员
};
  • 结构中的柔性数组成员前面必须至少一个其他成员。
  • sizeof 返回的这种结构大小不包括柔性数组的内存。
  • 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。 

我们来验证一下 【sizeof 返回的这种结构大小不包括柔性数组的内存。】--->【验证成功】


#include<stdio.h>
struct Stu
{char c;//1 int i;//4  //对齐规则:8int arr[];//也可以这样写int arr[0]//未知大小的数组 -柔性数组成员
};
int main()
{printf("%d", sizeof(struct Stu));return 0;
}

 

 验证完之后,我们再来学习一下【动态内存函数在柔性数组上的应用】吧! 


#include<stdio.h>
struct Stu
{char c;//1 int i;//4  //对齐规则:8int arr[];//也可以这样写int arr[0]//未知大小的数组 -柔性数组成员
};
int main()
{struct Stu* p = (struct Stu*)malloc(sizeof(struct Stu)+20);//arr里放5个整型if (p == NULL){perror("malloc");return 1;}free(p);p = NULL;return 0;
}

#include<stdio.h>
struct Stu
{char c;//1 int i;//4  //对齐规则:8int arr[];//也可以这样写int arr[0]//未知大小的数组 -柔性数组成员
};
int main()
{struct Stu* p = (struct Stu*)malloc(sizeof(struct Stu)+20);//arr里放5个整型if (p == NULL){perror("malloc");return 1;}//发10个整型struct Stu* s = (struct Stu*)realloc(p, sizeof(struct Stu) + 40);if (s != NULL){p = s;}else{perror("realloc");return 1;}//释放free(p);p = NULL;return 0;
}

 想必大家都知道为什么叫柔性数组,因为【利用realloc任意调整数组的空间大小】记得及时释放

 柔性数组需要对齐吗?动动小手测试一下。

柔性数组的使用 

对柔性数组赋值1,2,3,4,5并打印出来。

#include<stdio.h>
#include<stdlib.h>
struct Stu
{char c;//1 int i;//4  //对齐规则:8int arr[];//也可以这样写int arr[0]//未知大小的数组 -柔性数组成员
};
int main()
{struct Stu* p = (struct Stu*)malloc(sizeof(struct Stu)+20);//arr里放5个整型if (p == NULL){perror("malloc");return 1;}p->c = 't';p->i = 7;int i = 0;for (i = 0;i < 5; i++){p->arr[i] = i+1;}for (i = 0; i < 5; i++){printf("%d ", p->arr[i]);}//放10个整型struct Stu* s = (struct Stu*)realloc(p, sizeof(struct Stu) + 40);if (s != NULL){p = s;}else{perror("realloc");return 1;}//释放free(p);p = NULL;return 0;
}

 

柔性数组还可以应用于【通讯录 】,后期我们也会去实现通讯录,并用【柔性数组】优化。

动态内存函数增容柔性数组模拟实现 

柔性数组的优势

 通过上面两端代码的比较,即便它们的功能一致,我们可以清晰的发现【柔性数组的优势】

【优点1】方便释放 一次性就释放完全


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

【优点2】这样有利于访问的速度,减少内存碎片,提高空间利用率


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

最后,有一篇文章,感谢他让我受益匪浅。 

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

【建议书】C陷阱与缺陷  高质量C\C++ 剑指offer 明解C语言等等 

最后我想对我自己说,其实学习就是这样,刚开始并不喜欢计算机这门专业。其实我很想去选小语种西班牙语去到国外做翻译去看世界,而且我的理科思维并不好,但是在选择这门学科之后,当我开始认真的学习一些C语言的语法之后,我看到我自己独立写出来的游戏小程序的时候,还是挺有成就感,特别看到博客被大家看到,传递一些知识,还是很幸福的。写博客挺费时间的,但是我希望小唐可以一直坚持的学习,坚持写博客和交流知识。慢慢走,每一步都算数的。

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!

代码------→【gitee:唐棣棣 (TSQXG) - Gitee.com】

联系------→【邮箱:2784139418@qq.com】

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

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

相关文章

clickhouse之readonly解决方法

1&#xff0c;问题描述 日志报错写入ck报错&#xff1a;ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, code: 1002, host: 192.16.1.19, port: 8123; Code: 242. DB::Exception: Table is in readonly mode: replica_path/clickhouse/tables…

基于SSM的高校工会提案管理信息系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

九小场所安全隐患排查—线上隐患上报、整改

为进一步加强治安管理工作&#xff0c;严格落实安全责任&#xff0c;扎实筑牢“安全防火墙”&#xff0c;营造和谐、稳定、文明的社会环境。我们可借助凡尔码搭建九小场所安全码&#xff0c;实现消防安全监督管理&#xff0c;落实消防安全责任&#xff0c;形成九小场所网格化监…

Mock工具之Moco使用

一、什么是Mock mock英文单词有愚弄、嘲笑、模拟的意思&#xff0c;这里主要是模拟的意思 二、什么是Moco 开源的、基于java开发的一个mock框架支持http、https、socket等协议 三、Mock的特点 只需要简单的配置request、response等即可满足要求 支持在request 中设置headers、…

linux安装filebeat并收集日志到elasticsearch

摘要&#xff1a; 通过filebeat收集服务器上各个应用的日志到elasticsearch&#xff0c;通过tags区分不同的应用创建不同的索引保存日志。 官网地址&#xff1a; https://www.elastic.co/cn/downloads/past-releases#filebeat 安装步骤&#xff1a; 1&#xff1a;下载并解…

asp.net网上销售系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 网上销售系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语言开发 aspnet 网上销售系统1 二、功能介绍 前台功能…

第二证券:汽车产业链股活跃,恒勃股份、博俊科技“20cm”涨停

轿车产业链股9日盘中走势活跃&#xff0c;截至发稿&#xff0c;恒勃股份、博俊科技“20cm”涨停&#xff0c;德迈仕涨超17%&#xff0c;上声电子涨超14%&#xff0c;川环科技涨超10%&#xff0c;圣龙股份、科华控股、沪光股份、上海沿浦、日盈电子、赛力斯等均涨停。 工作方面…

用Nginx搭建一个可用的静态资源Web服务器

sudo wget http://dlib.net/files/dlib-19.24.tar.bz2下载需要的文件。 sudo tar jxf dlib-19.24.tar.bz2进行解压。 sudo mkdir /nginx/dlib在nginx安装目录/nginx创建一个新的目录dlib。 配置文件nginx.conf里边的内容如下&#xff1a; worker_processes 1; events {…

Astronomaly:利用 CNN 和主动学习识别 400 万张星系图像中的异常

星系中的异常现象是我们了解宇宙的关键。然而&#xff0c;随着天文观测技术的发展&#xff0c;天文数据正以指数级别增长&#xff0c;超出了天文工作者的分析能力。 尽管志愿者可以在线上参与对天文数据的处理&#xff0c;但他们只能进行一些简单的分类&#xff0c;还可能会遗漏…

【轻松玩转MacOS】安全隐私篇

引言 这一篇将介绍如何保护MacOS的安全&#xff0c;包括如何设置密码&#xff0c;使用防火墙&#xff0c;备份数据等重要环节&#xff0c;避免因不慎操作或恶意攻击带来的安全风险&#xff0c;让你的MacOS之旅更安心、更放心。 一、设置密码&#xff1a;保护你的MacOS的第一道…

MySql运维篇---009:分库分表:垂直拆分、水平拆分、通过MyCat进行分片,读写分离:一主一从、 双主双从

3.分库分表 3.1 介绍 3.1.1 问题分析 使用单个数据库存储所有的数据&#xff0c;如果磁盘和内存和内存不足了可以增大磁盘和内存&#xff0c;但是对于一台服务器的磁盘和内存不可能无限制的扩张下去&#xff0c;它是受我们服务器的硬件影响的&#xff0c;如果说数据库所存储…