【C语言】动态内存分配(一)

news2024/10/5 21:20:30

目录

1.为什么要有动态内存分配

2.malloc和free

2.1malloc

2.2free


1.为什么要有动态内存分配

我们已经掌握的内存开辟方式有:

但是上述的开辟空间的方式有两个特点:

空间开辟大小是固定的。
数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小不能调整
但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。
C语言引入了动态内存开辟,让程序员自己可以申请和释放空间,就比较灵活了。

2.malloc和free

2.1malloc

C语言提供一个动态开辟内存的函数:

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

⭐如果开辟成功,则返回一个指向开辟好空间的指针。
⭐如果开辟失败,则返回一个|NULL指针,因此malloc的返回值一定要做检查。
⭐返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
⭐如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。

malloc申请的空间位于内存的堆区:

使用malloc函数需要头文件<stdlib.h>

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p = (int*)malloc(40);//开辟一个大小为40字节的空间用于存储int型的数据
	for(int i=0;i<10;i++)
	{
		*(p + i) = i;//遍历开辟的空间并赋值(0 1 2 3 4 5 6 7 8 9)
	}
	if(p==NULL)//假如开辟空间失败P会指向NULL,使用perror抛出错误
	{
		perror("malloc"); 
		return 1;
	}
	for(int i=0;i<10;i++) //遍历开辟的空间,并打印出数值
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

2.2free

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

free函数用来释放动态开辟的内存。
⭐如果参数ptr)指向的空间不是动态开辟的,那free函数的行为是未定义的。

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

与malloc函数一样free也声明在<stdlib.h>头文件中

举个例子:

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

int main()
{
	int num = 0;
	scanf_s("%d", &num);
	int arr[num] = { 0 };
	int* ptr = NULL;
	ptr = (int*)malloc(num * sizeof(int));
	if(NULL!=ptr)
	{
		int i = 0;
		for(i=0;i<num;i++)
		{
			*(ptr + i) = i;
		}
	}
	free(ptr);//释放ptr指向的动态内存
	ptr = NULL;//是否有必要
	return 0;
}

⭐ free(ptr);  释放了ptr指针指向的动态内存。

🔺ptr=NULL;这一步是十分有必要的因为free仅仅是释放了ptr指针指向的动态空间,但是ptr指针仍然指向那片空间的起始位置,这样的代码是十分危险的,所以我们free释放空间后需要让ptr指向空。

以上便是我为大家带来的动态内存管理(一)的内容,若有不足,望各位大佬在评论区指出,谢谢大家!可以留下你们点赞、收藏和关注,这是对我极大的鼓励,我也会更加努力创作更优质的作品。再次感谢大家!  

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

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

相关文章

大模型实体化:个人智能体为AI PC注入灵魂

从Alpha GO到Chat GPT&#xff0c;从DALL-E到Sora&#xff0c;AI时代的演进正行驶在快车道&#xff0c;人工智能正受到有史以来最高的关注。人们在生怕被快速变革的AI时代抛弃的同时&#xff0c;也不禁疑惑&#xff0c;AI浪潮的下一步在哪里&#xff1f; 大模型实体化&#xff…

java-函数式编程-函数对象

定义 什么是合格的函数&#xff1f;无论多少次执行函数&#xff0c;只要输入一样&#xff0c;输出就不会改变 对象方法的简写 其实在类中&#xff0c;我们很多参数中都有一个this&#xff0c;被隐藏传入了 函数也可以作为对象传递&#xff0c;lambda就是很好的例子 函数式接口中…

jenkins汉化不完全问题解决

jenkins安装完Localization:Chinese(Simplified)中文语言包后&#xff0c;发现是出现汉化不完全或者部分汉化的情况&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 启动命令中指定语言 -Duser.languageen_US.UTF-8 或者 -Duser.languageC.UTF-8原因分析&#xff1a;安…

第十五届蓝桥杯Java软件开发大学B组自我经验小结

自我介绍 23届大一 双非 计院科班 软件工程 江苏人在吉林上大学 Java蒟蒻 在学校的宣传下 有幸参加了第十五届蓝桥杯Java大学b组省赛 蓝桥杯说明 就是一个算法比赛吧 考试时间9.00到1.00 四小时 带准考证和身份证和笔 草稿纸会发 赛制是IOC就是不会给任何反馈 就是你…

基于粒子滤波器的电池剩余使用寿命计算matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 粒子滤波器基础 4.2 电池剩余使用寿命建模与预测 4.3 粒子滤波器在电池寿命预测中的应用 5.完整工程文件 1.课题概述 基于粒子滤波器的电池剩余使用寿命计算。根据已知的数据&#xff0c;预测未来…

Python绘制的好看统计图

代码 sx [Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, P…

数据结构(C):玩转顺序表

&#x1f37a;0.前言 言C之言&#xff0c;聊C之识&#xff0c;以C会友&#xff0c;共向远方。各位博友的各位你们好啊&#xff0c;这里是持续分享数据结构知识的小赵同学&#xff0c;今天要分享的数据结构知识是顺序表&#xff0c;在这一章&#xff0c;小赵将会向大家展开聊聊顺…

PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波

什么是高斯滤波 高斯滤波是一种常见的图像处理技术&#xff0c;用于去除图像中的噪声和平滑图像。它的原理基于统计学中的高斯分布&#xff08;也称为正态分布&#xff09;。 在高斯滤波中&#xff0c;一个二维的高斯核函数被用来对图像中的每个像素进行加权平均。这个高斯核…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt+hadoop + redis 医院就诊系统 设计与实现

一.项目介绍 前端&#xff1a;患者注册 、登录、查看首页、医生排班、药品信息、预约挂号、就诊记录、电子病历、处方开药、我的收藏 后端分为&#xff1a; 医生登录&#xff1a;查看当前排班信息、查看患者的挂号情况、设置患者就诊记录、电子病历、给患者开药和个人信息维护 …

LeetCode 11—— 盛最多水的容器

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 暴力法&#xff0c;遍历所有可能的垂线对 ( i , j ) (i, j) (i,j)&#xff0c;求取最大面积&#xff1a; a r e a m i n ( h [ i ] , h [ j ] ) ∗ ( j − i ) area min(h[i]…

when to create a ViewRootImpl

when to create a ViewRootImpl when method setView is called: when method dispatchDetachedFromWindow is called:

2024年【起重机械安全管理】考试内容及起重机械安全管理操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械安全管理考试内容根据新起重机械安全管理考试大纲要求&#xff0c;安全生产模拟考试一点通将起重机械安全管理模拟考试试题进行汇编&#xff0c;组成一套起重机械安全管理全真模拟考试试题&#xff0c;学员可…

ubuntu20.04安装nodejs并创建简单的node.js应用

一. 安装nodejs Node.js 为 Linux、Windows 和 macOS 提供了不同的软件包。您可以访问 Node.js 官方网站并选择与您的操作系统对应的下载链接。 第一步&#xff1a;打开官网下载源文件 中文网址:http://nodejs.cn/download/ 第二步&#xff1a;解压压缩包 tar -xvf node-v18.…

关于Spring Aop的通知类型

一、概述 1.1 通知类型 为了符合各种流程处理&#xff0c;通知类型提供了5种&#xff0c;可以对目标方法进行全方位处理&#xff0c;如下所示&#xff1a; 通知类型说明前置通知&#xff08;Before advice&#xff09;在某连接点之前执行的通知&#xff0c;但这个通知不能阻止…

【C语言】atoi和atof函数的使用

人生应该树立目标&#xff0c;否则你的精力会白白浪费。&#x1f493;&#x1f493;&#x1f493; 目录 •&#x1f319;知识回顾 &#x1f34b;知识点一&#xff1a;atoi函数的使用和实现 • &#x1f330;1.函数介绍 • &#x1f330;2.代码演示 • &#x1f330;3.atoi函数的…

Java | Spring框架 | 快速入门实战

一、Spring框架简介&#xff1a;为何选择Spring&#xff1f; Spring框架是一个开源的Java平台&#xff0c;它最初由Rod Johnson设计&#xff0c;并且首次发布于2003年。Spring使Java开发变得更加容易&#xff0c;它提供了一种更简洁、更强大、更易于测试的方式来构建Java应用。…

Debian操作系统的常用指令介绍

Debian是一个流行的Linux操作系统&#xff0c;以其稳定性和安全性而闻名。对于Debian用户来说&#xff0c;掌握一些基本的命令行指令是非常重要的&#xff0c;因为它们可以帮助你更高效地管理系统。在这篇博客中&#xff0c;我们将介绍一些在Debian系统中常用的指令及其功能。 …

【20】JAVASE-网络编程【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

快速建站介绍

随着在线业务和电子商务的规模不断扩大&#xff0c;初创公司、个人网站和小型企业都需要快速地搭建自己的网站&#xff0c;以便更好地展示自己、推广产品和服务&#xff0c;并实现在线交易。快速建站已成为在线业务发展的一种主流方式&#xff0c;因为它能够快速地创建一个响应…

【C++】哈希的应用---布隆过滤器

目录 1、引入 2、布隆过滤器概念 3、选择哈希函数个数和布隆过滤器长度 4、布隆过滤器的实现 ①框架的搭建 ②设置存在 ③检查存在 ④不支持 reset 5、布隆过滤器计算误差 6、布隆过滤器的优缺点 ①布隆过滤器优点 ②布隆过滤器缺陷 7、布隆过滤器的实际应用 8、完…