内存管理--柔性数组

news2024/11/28 10:53:08

本次讲的是,柔性数组,如果哪位小博客想要了解的更多,可以登录下面这个网站,了解详细内容

C语言结构体里的成员数组和指针 | 酷 壳 - CoolShellicon-default.png?t=N7T8https://coolshell.cn/articles/11377.html

  • 我们就听说过数组,听说过柔性数组吗?柔性数组建立在结构体中,最后一个成员(是数组)并且没有指定大小。这就叫:柔性数组。它的标准代码为:
    //柔性数组
    
    struct S
    {
    	char c;
    	int a;
    	int arr[];//柔性数组没有指定大小
    };

    这个就是柔性数组的基本表达。

  • 柔性数组的特点:1.结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。

                                    2.sizeof返回的这种结构⼤⼩不包括柔性数组的内存。

                                   3.包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配                                           的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

它的代码为:

//柔性数组的特点
struct S
{
	int a;
	int arr[];
};
int main()
{
	printf("%zd\n", sizeof(struct S));
	return 0;
}

打印的数字是4,这就说明,柔性数组不包含它自己本身的大小,而是它前一个数的大小。

  • 柔性数组的使用:我们先直接上代码,然后在分析,则代码为:
    //柔性数组的使用
    struct S
    {
    	int a;
    	int arr[];
    };
    int main()
    
    {
    	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
    	if (ps == NULL)
    	{
    		perror("malloc");
    		return 1;
    	}
    	ps->a = 100;
    	int i = 0;
    	for (i = 0; i < 5; i++)
    	{
    		ps->arr[i] = i;
    	}
    	//调整空间
    	struct S* ptr = (struct S*)realloc(ps,sizeof(struct S) + 10 * sizeof(int));
    	if (ptr != NULL)
    	{
    		ps = ptr;
    	}
    
    	//释放
    	free(ps);
    	ps = NULL;
    	return 0;
    }
    

    对于这第一种代码,就是把内存放在堆上,还有第二种代码,我们来比较一下,看看哪种代码更容易被接受,则代码二为:

    #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;
    }

    你们说这两种代码,哪一个更好?

其实,两种代码,都有各自的好处,各有各的特点,首先第一个,它释放内存快,方便释放内存

第二个,方便访问内存的速度,各有各的千秋吧,

我们不去讨论哪一个更好,而是要看,它们各自的优点。你们认为呢?

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

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

相关文章

【机器学习300问】58、什么是词袋模型和N-gram模型?

词袋模型&#xff08;Bag of Words, BoW&#xff09;和N-gram模型主要用于早期的自然语言处理任务&#xff0c;上文中我介绍了机器是如何读懂文本的四个阶段&#xff0c;这篇文章带大家来看看在不同阶段中会用到的两个模型——词袋模型和N-gram模型。如果没有读过我之前的文章&…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

《拆解一切问题》如何成为解决难题的高手 - 三余书屋 3ysw.net

拆解一切问题&#xff1a;如何成为解决难题的高手 今天给大家分享的这本书叫做《拆解一切问题》&#xff0c;标题看起来确实有点虚&#xff0c;在没有读这本书之前&#xff0c;会让人感觉似乎只要读完学会书中的内容&#xff0c;就可以解决一切问题了。但事实上这种认识是误解…

网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具 ​ 常用的有&#xff1a;json、protobuf、xml三种方案&#xff1b; 5.1json的使用 1.安装jsoncpp库&#xff0c;是一个第三方的开发库文件&#xff1b; sudo yum install -y jsoncpp-devel2.使用json ​ 经常使用的头文件是json.h&…

跟张良均老师学大数据人工智能——泰迪智能科技第二期在线实习项目已开营

在这个信息爆炸的时代&#xff0c;如何有效地收集、处理、分析和利用数据&#xff0c;以获取有价值的信息&#xff0c;成为了各行各业面临的关键挑战。因此&#xff0c;数据分析挖掘、人工智能和大数据开发等领域的需求日益凸显&#xff0c;这些技术也成为了推动社会进步的重要…

【python plotly库介绍】从视觉到洞见:桑基图在业务分析中的应用【保姆级教程过于详细珍藏版】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 本文结构&#xff1a;工具介绍python实现库 - 案例 - 分析思路与过程 实战专栏&#xff1a;https://blog.csdn.net/cciehl/category_12615648.html 备注说明&#xff1a; 企业…

【面试题】RocketMQ如何处理消息重复的问题呢?

对分布式消息队列来说&#xff0c;同时做到确保一定投递和不重复投递是很难的&#xff0c;就是所谓的“有且仅有一次” 。RocketMQ择了确保一定投递&#xff0c;保证消息不丢失&#xff0c;但有可能造成消息重复。 处理消息重复问题&#xff0c;主要有业务端自己保证&#xff…

自动驾驶杂谈

在2024年的今天&#xff0c;自动驾驶技术已经迈向了一个崭新的阶段&#xff0c;日趋成熟与先进。昨日&#xff0c;我有幸亲眼目睹了自动驾驶车辆在道路上自如行驶的场景。然而&#xff0c;在市区拥堵的路段中&#xff0c;自动驾驶车辆显得有些力不从心&#xff0c;它们时而疾驰…

机器学习 -- 随机森林DEMO

场景 之前看一些歌手或者演员选取节目的时候&#xff0c;上面不是一个评委&#xff0c;少则三五个&#xff0c;多则几十个&#xff0c;当做重要决定时&#xff0c;大家可能都会考虑吸取多个专家而不只是一个人的意见。机器学习也是一样的&#xff0c;机器学习中分为两种&#…

“IT小百科 ”之“那些看不懂的HTTP状态码详解”

“IT小百科 ”之“那些看不懂的HTTP状态码详解” 小伙伴们应该遇到过在浏览器中打开某个网页&#xff0c;半天没打开&#xff0c;然后网页给出一个“ 提示码”&#xff0c;如下图所示 &#xff1a; 我相信看到这个提示的小伙伴普遍有点懵&#xff0c;这个提示码到底是什么意思…

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

结构体与位段的定义以及在内存中的存储

目录 结构体的声明 完全声明 不完全声明 结构体变量的定义和初始化 结构体的嵌套 结构体成员的直接访问和间接访问 结构体的自引用 typedef对结构体类型重命名 结构体内存对齐 对齐规则 练习 为什么存在内存对齐 修改默认对齐数 结构体传参 结构体实现位段 位段…

代码膨胀会破坏开发操作吗,它将如何影响编译时间?

Incredibuild 正潜心研究公司以及客户的未来发展趋势。 过去的一年举步维艰&#xff0c;但聪明的企业总是能够抓住机遇&#xff0c;将大部分业务自动化&#xff0c;保持敏捷度和竞争力&#xff0c;最佳的案例就是游戏工作室。这一年来&#xff0c;用户对新游戏或新版本的期待达…

Python 基础:标准库 -- math (数学函数)

1. 官方文档 math --- 数学函数 — Python 3.12.2 文档 cmath --- 关于复数的数学函数 — Python 3.12.2 文档 Python 中&#xff0c;可以使用内置的数学运算符&#xff0c;例如加法 ()、减法 (-)、除法 (/) 和乘法 (*) 进行简单的数学运算。不过&#xff0c;更高级的运算&a…

Python | Leetcode Python题解之第3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合&#xff0c;记录每个字符是否出现过occ set()n len(s)# 右指针&#xff0c;初始值为 -1&#xff0c;相当于我们在字符串的左边界的左侧&#xff0c;还没…

Dubbo 原理及使用详解

嗨&#xff0c;亲爱的童鞋们&#xff01;欢迎来到这次关于Dubbo的探险之旅。在编程的世界里&#xff0c;我们时常需要处理分布式系统的问题&#xff0c;而Dubbo作为一款开源的分布式服务框架&#xff0c;正是为了解决这类问题而生。本篇博客将深入浅出&#xff0c;带你领略Dubb…

transformers微调模型后使用pieline调用无法预测列表文本

初学transformers框架 使用trainer简单训练一个文本分类模型三个epoch后 使用piepline调用model 和tokenizer后 发现 传入列表文本后 输出就变得不正常了&#xff0c;为么子哇 如下图

常见的DC电源模块故障及解决方法

BOSHIDA 常见的DC电源模块故障及解决方法 DC电源模块广泛应用于各种电子设备中&#xff0c;为其提供稳定的直流电源。然而&#xff0c;由于长期使用或其他原因&#xff0c;DC电源模块有时会出现故障。本文将介绍一些常见的DC电源模块故障及相应的解决方法。 1. 输出电压异常&a…

如何使用免费的ChatGpt3.5

如何使用免费的ChatGpt 最近免费的gpt3.5很多都不怎么行了实在是太给力了尾声 最近免费的gpt3.5很多都不怎么行了 原因是什么呢&#xff1f;因为openai已经取消了免费的5刀赠送&#xff0c;那么这些人手上的免费的sses-key 用完后&#xff0c;就基本上全军覆没了&#xff0c;再…

探索http-vue-loader的奥秘:原理、使用方法、在Vue开发中的应用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…