动态内存管理:malloc free

//——————1.动态内存管理(内存空间)

共四个函数:malloc   free  calloc  realloc

1. 为什么存在动态内存分配

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

int val = 20;//在栈空间上开辟四个字节

char arr[10] = { 0 };//在栈空间上开辟10个字节的连续空间

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

1. 空间开辟大小是固定的(不够方便)。

2. 数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。

但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。

这时候就引入了动态内存开辟。

——————2动态内存函数的介绍

2.1 malloc和free

malloc:头文件是<stdlib.h> 或<malloc.h>

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

void* malloc (size_t size);

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

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

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

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

如果参数 size(申请字节的大小) 为0,malloc的行为是标准是未定义的,取决于编译器。

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

void free(void* ptr);

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

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

//#include<stdio.h>//程序会报错

//int main()

//{

// int a = 1;

// int* p = &a;

// free(p);

// p = NULL;

// return 0;

//}

2.如果参数 ptr 是NULL指针,则函数什么事都不做,(free不知道释放谁)。

//#include<stdio.h>

//int main()

//{

// int* p = NULL;

// free(p);

// return 0;

//}

malloc和free都声明在 stdlib.h 头文件中。

//#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>

//#include<string.h> //strerror需要引用的头文件

//#include<stdlib.h>//或<malloc.h>

//#include<errno.h>

//int main()

//{

//

// int arr[10] = {0};//局部变量在栈区开辟的,不可以改变大小

// int* p = (int*)malloc(40);//malloc,calloc,realloc,free位于堆区,可以适当改变大小

// if (p == NULL)

// {

//  printf("%s\n",strerror(errno));//errno的使用需要引用头文件<errno.h>

// }//失败时,打印Not enough space

// int i = 0;

// for (i = 0; i < 10; i++)

// {

//  *(p + i) = i;//*(p+i):意思是p加i为跳过i个整型,解引用为找到40字节中数组的元素,=i为给每个元素赋值为i,即0 1 2 3 4 5 6....

//  printf("%d ", *(p + i));//0 1 2 3 4 5 6....

// }

// //没有free,并不意味着着,内存空间就不会回收了,当程序退出的时候,系统会自动回收内存空间。

// //内存泄漏:被分配一块空间时,用完后没有还,还一直在运行,别人也无法使用导致该块空间浪费,从而导致内存不再产生使用价值了——泄露

// free(p);//先将p所指向的空间释放,再给p赋值空指针,是因为p虽然被释放,但是其地址仍未改变。

// p = NULL;//不可以写成:free(p=NULL),因为指针p为空指针时,p的空间就找不到了,从而无法释放

// return 0;

//}    

// 变长数组并不意味着其长度可变,仅支持在c99中使用

int n = 0;

scanf("%d",&n);

int arr2[n];

无限开辟空间

//int main()

//{

// while (1)

// {

//  malloc(1);

// }

// return 0;

//}//系统会一直为其开辟空间,从而导致电脑崩溃。

若在开辟的时候,内存随着开辟一段时间后,会有缩小后再增加的情况时,就是存在内存泄漏的问题

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

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

相关文章

一、Qt介绍

一、Qt介绍 1、介绍 Qt是一套程序开发库&#xff0c;但是与MFC&#xff08;依赖于Windows API&#xff09;不同&#xff0c;Qt是跨平台开发库。 Qt获取&#xff1a;[Qt下载地址](https://download.qt.io/archive/qt/)2、Qt安装 QtMinGWSourcesQt ChartsQt Data Visualizatio…

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形)

如何在Android Glide中结合使用CenterCrop和自定义圆角变换&#xff08;图片部分圆角矩形&#xff09; 在Android开发中&#xff0c;使用Glide加载图片时&#xff0c;我们经常需要对图片进行特定的处理&#xff0c;比如裁剪和圆角变换&#xff0c;特别是一些设计稿&#xff0c;…

cpufreq子系统

cpufreq是linux上负责实现动态调频的关键&#xff0c;这篇笔记总结了linux内核cpufreq子系统的关键实现&#xff08;Linux 3.18.140&#xff09;。 概述 借用一张网络上的图片来看cpufreq子系统的整体结构&#xff1a; 用户态接口&#xff1a;cpufreq通过sysfs向用户态暴露接…

Java知识点:泛型、类加载器、内部类、可变参数

文章目录 1、this关键字2、泛型2.1 泛型介绍2.2 泛型分类定义2.2.1 泛型类2.2.2 泛型方法2.2.3 泛型接口 2.3 泛型通配符 3、可变参数4、日志4.1 使用步骤4.2 日志级别4.3 配置文件 5、类加载器5.1 类加载器5.2 类加载的完整过程5.2.1 类加载时机5.2.2 类加载过程 5.3 类加载的…

【开源项目】超经典开源项目实景三维数字孪生智慧工厂

数字孪生工厂&#xff0c;以模型驱动的自动化&#xff0c;与数据驱动的人工智能技术紧密融合与协同&#xff0c;实现机器、工件与组件间全面的和点对点的数据通信。飞渡科技基于自研DTS平台&#xff0c;将物联网IOT、人工智能、大数据、云计算等技术应用于工厂&#xff0c;实现…

期货日数据维护与使用_日数据维护_模块运行演示

写在前面&#xff1a; 本文默认已经创建了项目&#xff0c;如果不知道如何创建一个空项目的&#xff0c;请参看以下两篇博文 PyQt5将项目搬到一个新的虚拟环境中 https://blog.csdn.net/m0_37967652/article/details/122625280 python_PyQt5开发工具结构基础 https://blog.cs…

TMC4671闭环调试步进、伺服、音圈、永磁、无刷电机

一、IDE 连接开发板 下 面 讲 解 IDE 和 开 发 板 连 接 的 详 细 操 作 。 这 里 我 们 选 择 用 主 控 板 TMC671-EVALTMC6200-EVAL 开发板做讲解。其它型号的开发板也是大同小异 的操作步骤。 1&#xff0e;首先我连接好开发板&#xff0c;并给开发板上电 连接好的开发板如下…

【激活函数】SELU 激活函数

1、介绍 SELU (Scaled Exponential Linear Unit) SELU是对ELU激活函数的改进&#xff0c;通过引入自动标准化机制&#xff0c;使得神经网络的隐藏层在训练过程中可以自动地保持输出的均值和方差接近于1。 # 定义 SELU 激活函数 def selu(x, alpha1.67326, lambda_1.0507):retu…

【Python百宝箱】数据清洗艺术:Python库助力打磨完美数据

数据清洗与预处理&#xff1a;Python库大揭秘 前言 在数据科学领域&#xff0c;数据清洗和预处理是构建可靠模型的关键步骤。本文深入探讨了一系列强大的Python库&#xff0c;它们在处理重复数据、字符串匹配、数据整理以及降维等方面发挥着重要作用。通过学习这些库&#xf…

单片机相关知识点

在STM32上运行FreeRTOS&#xff0c;十分简练的小文章FreeRTOS&#xff08;STM32CubeMX&#xff09;_cubemx freertos-CSDN博客 STM32CubeMX转Keil使用STM32CubeMX生成Keil工程并完成流水灯-CSDN博客

unity PDFRender Curved UI3.3

【PDF】PDFRender 链接&#xff1a;https://pan.baidu.com/s/1wSlmfiWTAHZKqEESxuMH6Q 提取码&#xff1a;csdn 【曲面ui】 Curved UI3.3 链接&#xff1a;https://pan.baidu.com/s/1uNZySJTW0-pPwi2FTE6fgA 提取码&#xff1a;csdn

【unity小技巧】FPS游戏实现相机的震动、后坐力和偏移

最终效果 文章目录 最终效果前言相机的震动实现后坐力和偏移相机震动相机震动脚本换弹节点震动 武器射击后退效果完结 前言 关于后坐力之前其实已经分享了一个&#xff1a;FPS游戏后坐力制作思路 但是实现起来比较复杂&#xff0c;如果你只是想要简单的实现&#xff0c;可以看…

Linux ssh 实现远程免密登录

一、背景 我搭建了一个 zookeeper 集群&#xff0c;写了一个 shell 脚本来控制集群的启动和关闭&#xff0c;但是我发现每次我执行 shell 脚本的时候&#xff0c;都需要我输入各个服务器的密码才可以运行&#xff0c;感觉很麻烦。shell 脚本里面连接其他服务器用的就是 ssh 的方…

Linux安装JDK和Maven并配置环境变量

文章目录 一、安装JDK并配置环境变量二、安装maven并配置环境变量 一、安装JDK并配置环境变量 将JDK的安装包上传到Linux系统的usr/local目录 使用xftp上传文件 解压JDK的压缩包 xshell连接到云主机 [roottheo ~]# cd /usr/local[roottheo local]# ls aegis apache-tomcat-…

equals()方法和“==”运算符

equals()equals()方法和“”运算符比较 回到顶部 equals() 超类Object中有这个equals()方法&#xff0c;该方法主要用于比较两个对象是否相等。该方法的源码如下&#xff1a; public boolean equals(Object obj) {return (this obj);} 我们知道所有的对象都拥有标识(内存…

使用LVM分区方式安装Manjaro发行版

使用LVM分区方式安装Manjaro发行版 为什么单独介绍LVM方式呢&#xff1f; 主要是由于使用系统的图形安装工具创建卷组会出问题&#xff0c;会导致图形安装工具直接挂掉&#xff0c;唯一的方法是提前手动创建好卷组。 GPT分区表 分区表有&#xff1a; MBR(主引导记录分区表)…

【华为OD真题 Python】两数之和绝对值最小

文章目录 题目描述输入描述输出描述示例1输入输出说明代码实现题目描述 给定一个从小到大的有序整数序列(存在正整数和负整数)数组 nums ,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值,并返回这个绝对值。 每种输入只会对应一个答案。但是,数组中…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

【算法】链表-20240105

这里写目录标题 一、LCR 023. 相交链表二、142. 环形链表 II 一、LCR 023. 相交链表 给定两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 提示&#xff1a; listA 中节点数目为 m list…

window 下载安装 Studio 3T

这里 我们先访问官网 https://studio3t.com/ 然后 他会弹出提示 如果您同意使用cookies和类似技术进行市场研究或广告目的&#xff0c;并希望获得额外功能&#xff0c;您可以点击“Accept all”按钮。 如果您不同意使用cookies和类似技术进行上述目的&#xff0c;您可以点击“…