初识动态内存管理

前言:   

        我们都知道,内存分为几个区——栈区、堆区、静态区、常量区、代码区,我们在写代码的时候经常会遇到栈溢出这个问题,是因为在程序运行之前,我们无法准确的知道要分配多少空间给程序,所以说很容易造成栈溢出或者导致内存被白白的浪费——但是,动态内存管理,就可以帮助我们解决这个问题——它可以在堆区开辟出一些区域来分配给程序,所以说能够在一定程度上避免栈溢出的问题(strack overflow)还可以根据用户的需求更加灵活的分配宝贵的内存。

malloc函数:

        我用我的方式理解,这是一个最基本的动态内存分配函数,它直接在堆区开辟一块内存,然后返回空指针给程序,我们需要用一个有类型的指针对其接收,下面来举个例子:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//用strerror函数的头文件
#include<errno.h>//用erron函数的头文件
#include<string.h>//用于报错的头文件
int main()
{
	int* p = (int*)malloc(40);//malloc函数申请40字节的空间,用p来接受
	if (p == NULL)//判断,如果没有申请成功,则p为空指针
	{
		printf("p:%s", strerror(errno));//将错误信息打印
		return 1;//如果错了就不执行了,直接终止代码,并且返回1
	}
	int i = 0;//如果申请成功
	for (i = 0; i < 10; i++)//则给p初始化
	{
		*(p + i) = i + 1;
	}
	for (i = 0; i < 10; i++)//将p打印出来看看
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

 

        我们发现,这样是成功的,malloc函数就是像这样使用的,值得注意的是,malloc函数返回的是空指针,我们先要用强制类型转换将其转为你需要的指针类型再使用,并且应该要养成一个好习惯,那就是先进行判断,是否申请成功,如果没有申请成功,应该打印错误信息并且终止程序,以免导致内存泄漏或者本来的空间出现问题。

free函数:

        内存是十分宝贵的,我们申请了内存,应该要及时的释放它,不然就会造成浪费,有可能你会觉得你的内存很大,才申请几十个字节,完全不影响,但其实不然;一方面是节约资源,另一方面,如果不释放的话,有可能会对于你后面的程序有影响,导致一些你很难发现的错误(bug)。所以说为了及时释放内存,我们要用free函数,它用法十分简单:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//用strerror函数的头文件
#include<errno.h>//用erron函数的头文件
#include<string.h>//用于报错的头文件
int main()
{
	int* p = (int*)malloc(40);//malloc函数申请40字节的空间,用p来接受
	if (p == NULL)//判断,如果没有申请成功,则p为空指针
	{
		printf("p:%s", strerror(errno));//将错误信息打印
		return 1;//如果错了就不执行了,直接终止代码,并且返回1
	}
	int i = 0;//如果申请成功
	for (i = 0; i < 10; i++)//则给p初始化
	{
		*(p + i) = i + 1;
	}
	for (i = 0; i < 10; i++)//将p打印出来看看
	{
		printf("%d ", *(p + i));
	}
    free(p);
    p=NULL;
	return 0;
}

        我们只需要在上面的代码后面加上free(你用来接收空间的变量名),就可以将申请的空间释放了,但是值得注意的是:虽然你释放了,但是p的地址还是原来的申请的空间的地址,如果你后面再对p有什么操作,极大可能将会影响到存入原来地址的新数据,所以说我们要让p等于一个空指针,这样它的地址才不会不变,也就不会对程序产生影响了。

        后面还有几个函数,下回分解。 

        


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

监控API的指标

监控服务器已经是常态了&#xff0c;但是监控API的表现是啥意思呢&#xff1f;还有监控指标&#xff1f;今天就来看看如何监控API。 正如监控应用程序以确保高质量性能一样&#xff0c;也必须监控API。 API是应用程序相互通信的管道。更具体地说&#xff0c;API提供了一种方法…

【算法每日一练]-图论(保姆级教程篇14 )#会议(模板题) #医院设置 #虫洞 #无序字母对 #旅行计划 #最优贸易

目录 今日知识点&#xff1a; 求数的重心先dfs出d[1]和cnt[i]&#xff0c;然后从1进行dp求解所有d[i] 两两点配对的建图方式&#xff0c;检查是否有环 无向图欧拉路径路径输出 topodp求以i为终点的游览城市数 建立分层图转化盈利问题成求最长路 会议&#xff08;模板题&a…

向日葵远程工具安装Mysql5.7的安装与配置

文章目录 一、向日葵远程工具安装二、Mysql5.7的安装与配置2.1解压2.2再把my.ini文件放入解压后的文件里面2.3.改变my.ini文件2.4.用管理员身份运行cmd&#xff0c;进入bin文件夹里&#xff0c;运行"mysqld install"命令&#xff0c;出现以下就说明成功了2.5.注册完s…

20. Mysql 游标的定义和使用

文章目录 概念游标的基本语法声明游标打开游标使用游标关闭游标精选示例 总结 概念 游标&#xff08;Cursor&#xff09;是一种数据库对象&#xff0c;可以指向存储在数据库表中的数据行指针。用于在 sql 语句的执行过程中&#xff0c;通过对查询结果集进行逐行的操作和访问。…

【大数据进阶第三阶段之Hive学习笔记】Hive常用命令和属性配置

目录 1、Hive安装 2、HiveJDBC访问 2.1、启动hiveserver2服务 2.2、连接hiveserver2服务 2.3、注意 3、Hive常用交互命令 3.1、“-e”不进入hive的交互窗口执行sql语句 3.2、“-f”执行脚本中sql语句 4、Hive其他命令操作 4.1、退出hive窗口 4.2、在hive cli命令窗口…

rosbag 源码阅读笔记-1

这篇文字想通过在自己的机器上查找rosbag的源码在哪里&#xff08;而不是通过google搜索&#xff09;&#xff0c;来和大家分享一些ros和python的常用命令&#xff0c;了解一下rosbag的调用过程。 怎么查到源码在哪里 当然我们可以直接上ros的官网去查看&#xff0c;路径在这…

静态网页设计——科学家网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1wg4y1Q7qm/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

基于Springboot的在线考试系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88499371 mysql5、mysql8都可使用 内含配置教程文档&#xff0c;一步一步配置 Springboot所写 管理员页面 学生页面

jetson deepstream 解码接入编码输出

不需要编解码输出画面的直接到7 使用就行 1 jetson主板编译工具 在jetson主板上安装gstreamer工具链&#xff0c;编译opencv sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-ugly gstreamer1.0-rtsp python3-dev pytho…

【信息论与编码】习题-判断题-第三部分

目录 判断题48. 利用状态极限稳态分布概率和符号的状态一步转移概率来求m阶马尔可夫信源的极限熵。49. 连续信源或模拟信号的信源编码的理论基础是限失真信源编码定理 。50. 具有一一对应关系的无噪信道的信道容量CH(X)。51. 在游程编码过程中&#xff0c;“0”游程和“1”游程…

PHP进阶-实现网站的QQ授权登录

授权登录是站点开发常见的应用场景&#xff0c;通过社交媒体一键授权可以跳过注册站点账户的繁琐操作。本文将讲解如何用PHP实现QQ授权登录。首先&#xff0c;我们需要申请QQ互联开发者账号获得APPID和密钥&#xff1b;接着&#xff0c;我们下载QQ官方SDK&#xff1a;PHP SDK v…

【VTKExamples::Visualization】第一期 Arbitrary3DCursor

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 前言 本文分享Example中Visualization模块中的Arbitrary3DCursor样例&#xff0c;主要解析vtkProbefileter&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会…

大学物理实验重点——霍尔效应

霍尔系数 霍尔元件灵敏度&#xff0c;愈大愈好 负效应&#xff1a; 1. 不等位电势 V0&#xff1a;两个霍尔电极不可能绝对对 称地焊在霍尔元件两侧&#xff08;图 2&#xff09;、霍尔元件电阻率不均匀、工作电极的端面接触不良都 可能造成 C、D 两极不处在同一等位面上。R0 确…

XCTF:凯撒大帝在培根里藏了什么[WriteUP]

密文&#xff1a; ABBABAABBAAAAABABABAABABBAAAAABAABBAAABAABBBABBAABABBABABAAABABBBAABAABABABBBAABBABAA 根据题目提示&#xff0c;应该有两种加密算法 1.培根加密 2.凯撒加密 根据语境&#xff0c;且密文与凯撒加密后的密文不符合&#xff0c;先尝试培根解密 培根解…

大数据时代必备技能!Shell脚本学习网站助你一臂之力!

介绍&#xff1a;Shell脚本是一种用于自动化任务的脚本语言&#xff0c;它使用Shell命令来执行一系列操作。Shell脚本通常以.sh为扩展名&#xff0c;并使用#!/bin/bash作为第一行来指定使用的Shell解释器。 在Shell脚本中&#xff0c;我们可以使用各种命令和控制结构来实现自动…

Hadolint:Lint Dockerfile 的完整指南

想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗&#xff1f;这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。 通过对 Dockerfile 进行 lint 检查&#xff0c;您可以及早发现错误和问题&#xff0c;并确保它们遵循最佳实践。 什么是Hadolint…

数据结构期中模拟

一、填空题 1.二叉树就是度为 2 的树。&#xff08;F&#xff09; 二叉树的度<2 2.线性表采用链式存储表示时&#xff0c;所有结点之间的存储单元地址可以连续也可以不连续。(T) 在顺序表中&#xff0c;逻辑上相邻的元素&#xff0c;其物理位置一定相邻。在单链表中&#x…

java案例知识点

一.会话技术 概念 技术 二.跨域 三.过滤器 四.拦截器

电脑丢失dll文件怎么办,dll修复工具可一键修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法找到某某.dll文件”。这种情况通常是由于dll文件丢失或损坏导致的。那么&#xff0c;究竟是什么原因导致了dll文件的丢失呢&#xff1f;又该如何预防dll文件…

Linux 编译安装 Nginx

目录 一、前言二、四种安装方式介绍三、本文安装方式&#xff1a;源码安装3.1、安装依赖库3.2、开始安装 Nginx3.3、Nginx 相关操作3.4、把 Nginx 注册成系统服务 四、结尾 一、前言 Nginx 是一款轻量级的 Web 服务器、[反向代理]服务器&#xff0c;由于它的内存占用少&#xf…
最新文章