动态内存管理(15)

news2024/11/13 9:42:18

目录

1、动态内存函数的介绍

1、malloc

2、free

3、calloc

4、realloc

2、常见的动态内存错误

3、C/C++程序的内存开辟

4、柔性数组

1、定义

2、柔性数组的特点:

3、使用


1、动态内存函数的介绍

1、malloc

malloc 向堆区申请一块连续可用的空间,并返回指向这块空间的指针。

注意:

1、如果开辟成功,则返回一个指向开辟好空间的指针。

2、如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。

3、返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。

4、如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

2、free

C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收。

注意:free函数用来释放动态开辟的内存。

1、如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。

2、如果参数 ptr 是NULL指针,则函数什么事都不做。

3、calloc

calloc 函数也用来动态内存分配。

注意:

1、函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。

2、与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

4、realloc

realloc 函数可以对动态开辟内存大小进行调整。

注意:

1、ptr 是要调整的内存地址。

2、size 调整之后新大小。

3、返回值为调整之后的内存起始位置。

4、realloc 在调整内存空间的是存在两种情况:

(1)情况1:原有空间之后有足够大的空间。要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。

(2)情况2:原有空间之后没有足够大的空间。原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址。

2、常见的动态内存错误

1、对NULL指针的解引用操作

2、对动态开辟空间的越界访问

3、对非动态开辟内存使用free释放

4、使用free释放一块动态开辟内存的一部分

5、对同一块动态内存多次释放

6、动态开辟内存忘记释放(内存泄漏)

3、C/C++程序的内存开辟

注意:

1、栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。

2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配方式类似于链表。

3、数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。

4、代码段:存放函数体(类成员函数和全局函数)的二进制代码。

static关键字修饰局部变量:实际上普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。但是被static修饰的变量存放在数据段(静态区),数据段的特点是在上面创建的变量,直到程序结束才销毁,所以生命周期变长。

4、柔性数组

1、定义

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

例如:这是两种表现形式

2、柔性数组的特点:

1、结构中的柔性数组成员前面必须至少一个其他成员。

2、sizeof 返回的这种结构大小不包括柔性数组的内存。

3、包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

3、使用

注意:直接struct S s;定义,是没有柔性数组成员的。

例如:

#include<stdio.h>
#include<stdlib.h>

struct S
{
	int n;
	float s;
	int arr[];//柔性数组成员
};

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S) + sizeof(int) * 4);
	if (ps == NULL)
		return 1;
	ps->n = 100;
	ps->s = 5.5f;
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		scanf("%d", &(ps->arr[i]));
	}
	printf("%d %f\n", ps->n, ps->s);
	for (i = 0; i < 4; i++)
	{
		printf("%d ", (ps->arr[i]));
	}
	free(ps);
	ps = NULL;
	return 0;
}

注意:柔性数组体现在,可以用realloc调整空间大小。

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

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

相关文章

【高阶数据结构】AVL树(动图详解)

&#x1f308;欢迎来到数据结构专栏~~AVL树详解 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

5G NR 标准 第12章 波束管理

第12章 波束管理 第 11 章一般性地讨论了多天线传输&#xff0c;然后重点介绍了多天线预编码。 讨论多天线预编码的一般假设是可以对不同的天线元件进行详细控制&#xff0c;包括相位调整和幅度缩放。 实际上&#xff0c;这需要在数模转换之前在数字域中执行发射机侧的多天线…

path 路径模块

1、什么是 path 路径模块 path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对路径的处理需求。 方法名 说明 path.join() 用来将多个路径片段拼接成一个完整的路径字符串 path.basename() 用来从路径字符串中…

Kubernetes(4)- 数据存储

第八章 数据存储 ​ 在前面已经提到&#xff0c;容器的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&#xff0c;保存在容器中的数据也会被清除。这种结果对用户来说&#xff0c;在某些情况下是不乐意看到的。为了持久化保存容器的数据&#xff0c;ku…

【Java 数据结构】常见排序算法(下)

目录 1、上期回顾 2、冒泡排序 3、快速排序 3.1 理解快速排序的二叉树结构 3.2 Hoare 法 3.3 三数取中 3.4 小区间优化 3.5 挖坑法 3.6 前后指针法 3.7 注意事项 4、归并排序 1、上期回顾 上期我们主要介绍了排序的基本认识&#xff0c;以及四个排序&#xff0c;分…

【Nginx】静态资源部署(上)

文章目录Nginx静态资源概述Nginx静态资源的配置指令listen指令server_name指令匹配执行顺序location指令设置请求资源的目录root / aliasindex指令error_page指令静态资源优化配置语法Nginx静态资源压缩Gzip模块配置指令Gzip压缩功能的实例配置Gzip和sendfile共存问题gzip_stat…

116.(leaflet之家)leaflet空间判断-点与多边形的空间关系

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

电脑怎么录屏?这三个简单的电脑录屏方法,不要错过

在现在的社会&#xff0c;电脑已经是我们日常工作中不可或缺的一部分。我们通常都要在电脑进行各种各样的操作&#xff0c;所以在向其他人展示电脑操作的时候&#xff0c;我们通常都会把整个操作过程录屏下来。那电脑怎么录屏&#xff0c;今天小编就给大家分享三个简单的电脑录…

分布式数据库中间件Sharding-JDBC介绍

前文中介绍了分布式数据库中间件Mycat的一些特性&#xff0c;作为对比本文简要介绍Sharding-JDBC的一些特性以及分片的实现原理&#xff0c;进行对比分析以了解。 1、ShardingSphere介绍 ShardingSphere是一套开源的分布式数据库中间件解决方案&#xff0c;目前由Sharding-JDB…

15个有用的JavaScript技巧

今天这篇文章&#xff0c;是我从网络上整理的一些常见的 JavaScript Tips。我在我的项目中使用了所有这些实用技巧&#xff0c;今天我想把它们分享给你&#xff0c;希望也能够帮助到你。 1.数字分隔符 为了提高数字的可读性&#xff0c;可以使用下划线作为分隔符。 const la…

pytorch学习记录

pytorch学习记录0.引言1.numpy 简单入门1.1.常用基础1.2.numpy其他学习2.pytorch 简单入门2.1.Pytorch的基本组成元素2.2.Pytorch构建神经网络2.3.进阶部分2.4.其他参考资料0.引言 一步一步积累吧。 一篇不错的博客 1.numpy 简单入门 1.1.常用基础 numpy中文手册 numpy官方…

【李宏毅】HW12

HW12一、作业描述1、Policy Gradient2、Actor-Critic二、实验1、simple2、medium3、strong三、代码一、作业描述 在这个HW中&#xff0c;你可以自己实现一些深度强化学习方法&#xff1a; 1、策略梯度Policy Gradient 2、Actor-Critic 这个HW的环境是OpenAI gym的月球着陆器。…

ubuntu | 重装ubuntu(VMware虚拟机环境)

前言 最近又把双系统的ubuntu搞崩了&#xff0c;在grub界面进不去&#xff0c;估计找不到启动项&#xff0c;被迫重装。 这次觉得还是windows系统好使&#xff0c;就用vmware虚拟机了。 一、安装vmware虚拟机 参考我之前的博客。 二、安装ubuntu 下载ubuntu18.04的iso文件…

15.2 浏览器中的进程

浏览器中的进程 start 上一篇文章&#xff0c;学习到了如何区分进程和线程。在这里再复习一下&#xff0c;进程类似于一个工厂&#xff0c;线程类似于工厂的工人&#xff0c;一个工厂可以有一个或多个工人。 1. 浏览器的进程 一个浏览器中有很多的进程&#xff0c;我以谷歌…

2023年的摸鱼小技巧:Python自动生成请假条【思路详解】

嗨害大家好鸭&#xff01;我是小熊猫~ 这不2023到了&#xff0c;新的一年&#xff0c;新的摸鱼 在办公室里的小透明来实现用Python来批量生成请假条&#xff0c; 这波啊&#xff0c;这波是智取&#xff01;&#xff01;&#xff01; Python资料电子书:点击此处跳转文末名片获…

Excel函数公式大全—SUMIF/SUMIFS函数

EXCEL系列文章目录 Excel系列文章是本人亲身经历职场之后萌发的想法&#xff0c;为什么Excel覆盖如此之广&#xff0c;几乎每个公司、学校、家庭都在使用&#xff0c;但是它深藏的宝藏功能却很少被人使用&#xff0c;PQ、BI这些功能同样适用于数据分析&#xff1b;并且在一些需…

内部成员之五:内部类

文章目录一、内部类分类&#xff1a;成员内部类vs局部内部类成员内部类实例化成员内部类每日一考一、内部类 1、Java中允许将类A声明在类B中&#xff0c;则类A就是内部类&#xff0c;类B为外部类。 分类&#xff1a;成员内部类vs局部内部类 成员内部类&#xff08;静态、非静…

【ElasticSearch7.X】学习笔记(三)

【ElasticSearch7.X】学习笔记五、集群部署5.1、相关概念5.1.1、集群 Cluster3.1.2、节点 Node5.2、下载安装5.3、 启动5.4、 测试六、进阶6.1、核心概念6.1.1、索引&#xff08;Index&#xff09;6.1.2、类型&#xff08;Type&#xff09;6.1.3、文档&#xff08;Document&…

Handler的学习

一、Handler到底有什么用呢&#xff1f; 首先看以下案例&#xff1a; public class MainActivity extends AppCompatActivity { Button btn;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activi…

vue这些原理你都知道吗?(面试版)

前言 在之前面试的时候我自己也经常会遇到一些vue原理的问题, 我也总结了下自己的经常的用到的,方便自己学习,今天也给大家分享出来, 欢迎大家一起学习交流, 有更好的方法欢迎评论区指出, 后序我也将持续整理总结~ 描述 Vue 与 React 区别 说明概念: vue:是一套用于构建用户…