动态内存管理(扫盲式讲解)

前言:学好数据结构的三大法宝:指针、结构体、动态内存管理,指针前面讲的已经很细了,大家看完了基本上指针方法是没啥问题的

1 为什么要有动态内存的开辟?

因为动态内存的开辟是在堆区里面的,可以释放,但是栈区的内存空间开辟是死的,无法释放。

2 怎么合理使用动态内存呢?

首先你要学会开辟内存,然后在合适的条件下释放内存

3 动态内存的应用

(1)首先带大家了解动态内存的函数

one:malloc

下面我们来在堆区放一个数组

malloc开辟空间有两种情况

1 开辟失败,返回的就是空指针

2 开辟成功返回一个指向好的空间的地址

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{int arr[10] = { 0 };int* p = &arr;p =(int*)malloc(sizeof(arr)*sizeof(int));//这里要判断一下,空间开辟是否失败,如果失败malloc返回的就是空指针if (p == NULL)return 1;for (int i = 0; i < 10; i++){p[i] = i;printf("%d ", p[i]);}//这里malloc开辟的空间用完了记得释放free(p);//然后把指针p置空p = NULL;return 0;
}

two:calloc

calloc与malloc只有一个区别,返回地址之前会把指针指向的内容全部初始化为0

int main()
{int* p = (int*)calloc(10,sizeof(int));//好习惯是每天养成的,记住一定要判断是否是空指针if (p == NULL)return 1;for (int i = 0; i < 10; i++){printf("%d ", p[i]);}free(p);p = NULL;return 0;
}

three:realloc

realloc的优点是让动态内存的空间管理非常灵活,如果觉得申请的内存空间大了,可以扩容,小了可以缩减。

扩容分为两种情况

(1)原有的空间后面的空间足够大,那么返回的就是原来的地址

(2)原有的空间后面的空间不够了,那么就要重新开辟一块空间,把原来地址里面的内容取出来放在现在开辟好的新的空间,返回的也是新的地址的起始地址

int main()
{int* p = (int*)calloc(10,sizeof(int));//好习惯是每天养成的,记住一定要判断是否是空指针if (p == NULL)return 1;for (int i = 0; i < 10; i++){printf("%d ", p[i]);}//现在我认为我的空间开辟小了想要扩容p = (int*)realloc(p, sizeof(int) * 15);//后面的sizeof(int) * 15是新空间的大小,单位是字节//然后我继续打印for (int i = 10; i < 15; i++){p[i] = i;printf("%d ", p[i]);}free(p);p = NULL;return 0;
}

最后再提一下如果realloc前面的指针是空指针,那么realloc的功能就等同于malloc了

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

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

相关文章

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

回归模型中多重共线性问题——逐步回归法、方差膨胀因子(VIF)、因子分析【含代码与解释】

特征之间的多重共线性&#xff0c;是指在回归模型中&#xff0c;自变量之间存在高度的线性相关性&#xff0c;导致回归系数的估计不准确&#xff0c;不稳定&#xff0c;甚至不可信的现象。多重共线性的存在会影响模型的解释能力和预测能力&#xff0c;增加模型的复杂度和不确定…

机器学习---环境准备

一、pySpark环境准备 1、window配置python环境变量 window安装python&#xff0c;配置python环境变量。安装python后,在环境变量path中加入安装的路径&#xff0c;cmd中输入python&#xff0c;检验python是否安装成功。 注意&#xff1a;如果使用的是anaconda安装的python环境…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一&#xff0c;前置知识准备 1&#xff0c;MVCC简介 MVCC 是多版本并发控制&#xff08;Multiversion Concurrency Control&#xff09;的缩写。它是一种数据库事务管理技术&#xff0c;用于解决并发访问数据库的问题。MVCC 通过创…

Matlab使用基础

基本命令 clear all %清除Workspace中的所有变量 clc %清除Command Window中的所有命令 %和%%是注释基础函数 abs()%取绝对值 char(65)%将ASCII码数值变成字符 num2str(65)%将里面的内容变成字符串 length()%字符串长度&#xff0c;不把/0的长度计算进去 矩阵 A[1 2 3;4 5 …

C语言-指针运算

1 1 2&#xff1f; 给一个指针加1表示要让指针指向下一个变量 int a[10]; int *p a; *(p 1) —>a[1]如果指针不是指向一片连续分配的空间&#xff0c;如数组&#xff0c;则这种运算没有意义 指针运算 这些算术运算可以对指针做&#xff1a;给指针加、减一个整数&…

python循环遍历指定路径下所有文件夹和文件

可以使用Python的内置库os和os.path来遍历文件夹。以下是一个简单的示例&#xff0c;该示例遍历给定目录下的所有文件和文件夹&#xff0c;并打印出文件类型和名称。 import osdef print_files(path):for root, dirs, files in os.walk(path):for file in files:print(os.path…

MinIO使用

MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单&#xff0c;基本是复制可执行程序…

Python 有趣的几个案例

1 有趣的回文数 **题目需求&#xff1a;**对于任何自然数&#xff0c;将它自身和它的倒序数&#xff08;反转过来&#xff09;相加&#xff0c;再将得到的和与它的倒序数相加&#xff0c;一直重复&#xff0c;最终总会得到一个回文数。 提示&#xff1b;回文数&#xff0c;如 …

GUI的简单概述和基本使用

GUI的概念 1&#xff0c;到目前为止&#xff0c;我们编写的都是控制输入的程序&#xff0c;操作使用非常不直观&#xff0c;采取一直方式让效果呈现在窗口上。 2&#xff0c;GUI及图形界面指采用图像方式显示的用户界面&#xff0c;与早期计算机的命令行界面相比&#xff0c;…

p标签显示不全并且实现自动换行

之前的代码 发现效果是这样的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5561e9dbe4b64cf49c85fcbac3f2c7c8.png) # 修改 添加word-wrap: break-word;"实现自动换行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/59a9b5ef89eb4d0dbeae1cae…

【SpringCloud】通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题

文章目录 前言1.第一次尝试1.1服务被调用方更新1.2压测第一次尝试1.3 问题分析1.4 同步的不是最新列表 2.第二次尝试2.1调用方过滤下线服务2.2压测第二次尝试2.3优化 写到最后 前言 在上文的基础上&#xff0c;通过压测的结果可以看出&#xff0c;使用DiscoveryManager下线服务…

程序员如何开发高级python爬虫?

之前我有写过一篇“高级爬虫和低级爬虫的区别”的文章&#xff0c;我们知道它并非爬虫领域中专用术语。只是根据爬虫的复杂性来断定是否是高级爬虫。以我个人理解&#xff1a;高级爬虫是可能具有更复杂的功能和更高的灵活性的爬虫。下面我们围绕高级爬虫来了解下有趣的事情。 低…

从输入URL到页面加载的全过程

从输入URL到页面加载的全过程 输入URL&#xff0c;并按下回车 浏览器检查浏览器缓存、系统缓存、路由器缓存&#xff0c;如果缓存中有&#xff0c;则直接显示页面&#xff0c;如果没有进行下一步 根据URL通过DNS进行域名解析&#xff0c;获取IP地址 DNS解析过程&#xff1a;是一…

python可视化plotly 图例(legend)设置大全,值得收藏!

文章目录 一、图例(legend)二、update\_layout(legend{}) 相关参数及示例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python…

多向通信----多人聊天

package 多人聊天; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; publ…

K8s中安装calico一直无法启动成功

问题描述 #k8s版本为v1.20.9查看对应日志 #calico-node-xxx 对应pod名称 kubectl logs calico-node-xxxx -n kube-system #没有错误但是一直启动不起来应该是版本不匹配问题解决方案 删除 calico重新安装对应版本删除podskubectl delete -f calico.yaml删除文件 rm -f calico.…

四步实现企业微信群的裂变增长

在这个流量红利逐渐消失的时代&#xff0c;获取客户变得越来越困难且成本高昂。因此&#xff0c;许多企业和商家开始转向私域流量的开发&#xff0c;以实现客户的持续增长和转化。企业微信作为一种有效的客户管理工具&#xff0c;被广泛用于私域流量的构建和管理。在私域流量的…

传统软件正在颠覆SaaS

曾经&#xff0c;SaaS的口号&#xff1a;“颠覆传统软件”喊得无比响亮。 但传统软件存在了这么多年&#xff0c;必然有其存在的合理性。 而自诩为“互联网公司”的SaaS公司&#xff0c;为了证明自己比传统软件“更先进”&#xff0c;反而犯过不少低级错误。 比如&#xff0…

electron-builder 的基本使用

electron打包说明 打包步骤 step1: 将 index.html 放到 h5 目录中 step2&#xff1a;在h5目录中 执行打包命令 yarn electron-builder打包结果 会生成一个 字里华夏 的目录, 1、cd 到 字里华夏 目录 其中有一个 字里华夏Setup1.2.0.exe文件&#xff0c; 这个是 桌面应用的…