当前位置: 首页 > news >正文

C语言之动态内存分配(1)

目录

本章重点

为什么存在动态内存分配
动态内存函数的介绍
malloc
free
calloc
realloc
常见的动态内存错误
几个经典的笔试题
柔性数组
动态内存管理—自己维护自己的内存空间的大小
首先我们申请一个变量,再申请一个数组

这是我们目前知道的向内存申请空间的一种方法 

但是这两种申请空间大小的方法有一个问题就是他的内存大小是不能被改变的

那么我们今天就引入动态内存分配这个知识点

首先我们来看一下malloc这个函数

Allocate memory block:开辟内存空间(块)

size_t size:size表示我要划分的字节,这40个字节有自己的起始位置,把起始位置的地址给你返回来,这40个字节的用途是不确定的,所以返回为void*,我们按照自己想要的类型进行强制类型转换,那么我们有没有申请空间的时候申请失败,,如果我的内存总共就8个G/16个G,所以一旦开辟失败就返回空指针(NULL)

现在我们来看代码(malloc函数如何使用)

#define CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{int arr[10] = { 0 };int* p = (int*)malloc(40);//我们拿一个整型指针接收,因为每加1就跳过一个整型,这样遍历我们每一个元素就会方便一些if (p == NULL){printf("%s\n", strerror(errno));return 1;}int i = 0;for (i = 0; i < 10; i++){*(p + i) = i;}for (i = 0; i < 10; i++){printf("%d ", *(p + i));}return 0;
}

我们把void*强制类型转化为Int*,我们拿一个整型指针接收,因为每加1就跳过一个整型,这样遍历我们每一个元素就会方便一些

如果动态内存开辟失败我就返回1

这个地方没有free,并不是说内存空间就不回收了,当程序退出的时候,系统会自动回收内存空间

这个时候我们把free加上来看效果

#define CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{int arr[10] = { 0 };int* p = (int*)malloc(40);//我们拿一个整型指针接收,因为每加1就跳过一个整型,这样遍历我们每一个元素就会方便一些if (p == NULL){printf("%s\n", strerror(errno));return 1;}int i = 0;for (i = 0; i < 10; i++){*(p + i) = i;}for (i = 0; i < 10; i++){printf("%d ", *(p + i));}free(p);return 0;
}

我在free(p)出添加一个断点,程序运行起来我们就直接走到了free(p)这个位置,我们把代码调试起来给大家看一看

 我们按住F10调试起来走到断点处,打开调试,窗口,监视,随便选一个窗口进入

 这里我们为什么要输入p,10呢?是因为我们的p是一个指针,要加一个10才能访问到数组中的所有元素,我们在按F10走出free(p)就可以看到内存被释放了,但是p的值是没有变的

那既然有成功的案例,那我们来看一下动态内存开辟失败的案例,来看下面代码

INT_MAX表示的数字是非常的大的,没有这么大的空间供你使用,所以我们此时动态内粗开辟失败

常见的一些类型对应的数字表示范围的大小

#define MB_LEN_MAX    5             /* max. # bytes in multibyte char */
#define SHRT_MIN    (-32768)        /* minimum (signed) short value */
#define SHRT_MAX      32767         /* maximum (signed) short value */
#define USHRT_MAX     0xffff        /* maximum unsigned short value */
#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
#define INT_MAX       2147483647    /* maximum (signed) int value */
#define UINT_MAX      0xffffffff    /* maximum unsigned int value */
#define LONG_MIN    (-2147483647L - 1) /* minimum (signed) long value */
#define LONG_MAX      2147483647L   /* maximum (signed) long value */
#define ULONG_MAX     0xffffffffUL  /* maximum unsigned long value */
#define LLONG_MAX     9223372036854775807i64       /* maximum signed long long int value */
#define LLONG_MIN   (-9223372036854775807i64 - 1)  /* minimum signed long long int value */
#define ULLONG_MAX    0xffffffffffffffffui64       /* maximum unsigned long long int value */

对于下面这个代码我们画个图给大家在解释一下

	int arr[10] = { 0 };int* p = (int*)malloc(40);if (p == NULL){printf("%s\n", strerror(errno));return 1;}

这里我们想一下我们前面讲到的野指针

free(p);
p = NULL;

malloc申请,free释放,我们暂时把p给释放了,但是p如果记得这个地址,那么p有朝一日能够找到这个内存区域,但是这个内存区域已经还给操作系统了,已经不属于我们了,这个时候我们把p拿起来去访问就成为了野指针,为了防止p成为空指针了,我们把它置为空,把他赋值为NULL,就好像是一条野狗,我们可以拿一根绳子把它拴在树上,希望大家能够理解

但是嫩你只顾申请但是不释放,这样就可能会导致内存泄漏的问题,给大家写一个死循环的开辟内存的代码

当然我的电脑比较落后一点,所有设施都稍微要落后一点,所以当时我运行起来就有一点卡,浏览器就被卡出去了,其实内存泄漏是非常危险的,感兴趣可以尝试一下,运行起来代码打开任务管理器可以发现他达到一定程度就会稳定下来,说明现代的电脑是非常聪明的

#include<stdio.h>
int main()
{while (1){malloc(1);}return 0;
}

本章终

 

 

http://www.lryc.cn/news/93649.html

相关文章:

  • AIGC新时代,注意政策走向,产业方向,拥抱可信AI。需要了解基本理论,基础模型,前沿进展,产品应用,以及小小的项目复现
  • 如何白嫖一年CSDN会员?618活动!亲测有效!!!
  • 微服务: 00-rabbitmq出现的异常以及解决方案
  • Vue3与Vue2比较
  • 如何对待工作中的失误?
  • 使用css3如何实现一个文字打印效果
  • 【雕爷学编程】Arduino动手做(115)---HB100多普勒雷达模块
  • 深度学习笔记之Transformer(一)注意力机制基本介绍
  • 基于SpringBoot的SSM整合案例 -- SpringBoot快速入门保姆级教程(四)
  • 占据80%中国企业出海市场,亚马逊云科技如何为出海客户提供更多资源和附加值
  • 系统架构设计师笔记第11期:信息安全的抗攻击技术
  • TLD7002学习笔记(二)-使用S32K144驱动TLD7002
  • [元带你学: eMMC协议详解 14] 数据擦除(Erase) 详解
  • 【程序人生-Hello‘s P2P】哈尔滨工业大学深入理解计算机系统大作业
  • Android Studio入门
  • r2pm -ci r2ghidra 时报错:checking pkg-config flags for r_core... no
  • 【宿舍管理系统】注册登录页面的实现(前端)
  • python写入excel,(二) 言简意赅傻瓜式写法
  • 我用ChatGPT写2023高考语文作文(六):北京卷II
  • Vue中如何进行图表绘制
  • 【Soft-prompt Tuning for Large Language Models to Evaluate Bias 论文略读】
  • Qt 定时器与定时事件
  • 《UNUX环境高级编程》(1)UNIX基础
  • MATLAB 入门之旅摘要
  • chatgpt赋能python:Python小数运算:解决精度问题的最佳实践
  • Linux 安装Docker完整教程(六)
  • 手机连接adb 相关问题汇总
  • MySQL数据相关操作
  • 2023年5月青少年软件编程(Python) 等级考试试卷(四级)
  • Python selenium自动化测试模型图解