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

news/2024/12/5 4:37:12/

目录

本章重点

为什么存在动态内存分配
动态内存函数的介绍
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.ppmy.cn/news/450241.html

相关文章

android 坏点测试软件,烧屏坏点检测软件下载-烧屏坏点检测官方安卓版v1.0-魅卓网...

烧屏坏点检测软件是一款非常好用的系统工具&#xff0c;这款软件是为专业人员精心打造&#xff0c;用户在下载这款软件后就直接可以进行测评&#xff0c;轻松的检查到烧屏的现象&#xff0c;看看你的手机或者电脑有没有出现任何的问题&#xff0c;需要的用户可以下载这款软件试…

iPhone X测试烧屏软件,关于iPhone X的烧屏 我来给你揭秘

前不久我们曾有过报道&#xff0c;苹果在一份更新了的支持文件中&#xff0c;确认了 iPhone X 是存在烧屏现象的。考虑到之前谷歌“亲儿子”Pixel 2 XL 的烧屏问题闹得沸沸扬扬&#xff0c;人们突然得知 iPhone X 同样不能幸免&#xff0c;一时间有些不知所措。 iPhone X 的烧屏…

Java泛型详解,史上最全图文详解

泛型在java中有很重要的地位&#xff0c;无论是开源框架还是JDK源码都能看到它。 毫不夸张的说&#xff0c;泛型是通用设计上必不可少的元素&#xff0c;所以真正理解与正确使用泛型&#xff0c;是一门必修课。 一&#xff1a;泛型本质 Java 泛型&#xff08;generics&#…

NFS服务器

文章目录 NFS服务器NFS的由来与功能什么是NFS(Network File System)什么是RPC(Remote Procedure Call)NFS启动的RPC daemons NFS Server 端的配置所需要的软件NFS的软件结构/etc/exports配置文件的语法与参数 启动NFSRPC服务的注册状况怎么查看(rpcinfo) NFS的连接查看showmoun…

机械革命Z3 Pro和机械革命蛟龙7有什么区别 哪个好详细配置对比

机械革命Z3 Pro使用的是一块可自定义RGB的紧凑型全尺寸背光键盘&#xff0c;按键采用侧边全透光设计&#xff0c;让玩家即使在黑暗的环境下也能轻松掌控操作。选机械革命Z3 Pro还是机械革命蛟龙7这些点很重要看过你就懂了 http://www.adiannao.cn/dy 机身A/C面采用的是航空喷砂…

机械革命无界14锐龙版2023参数 机械革命无界14锐龙版2023怎么样

外观设计方面&#xff0c;无界 14 锐龙版 2023 采用简洁的设计&#xff0c;机身采用了银色阳极氧化铝合金材质&#xff0c;配有银色 A 面大面积镭雕 LOGO 和炫彩 LOGO。 机械革命无界14锐龙版2023更多使用感受和评价 http://www.adiannao.cn/dy 配置方面&#xff0c;无界 14 锐…

机械革命 Code Go 评测

机械革命 Code Go 搭载了 45W 性能释放到 i7-12700H 处理器&#xff0c;机身 ACD 采用了金属材质&#xff0c;薄至 18mm&#xff0c;轻至 1.3kg。 机械革命 Code Go 更多使用感受和评价 http://www.adiannao.cn/e 屏幕方面&#xff0c;这款笔记本配备了 14 英寸 2.5K 120Hz 屏…

机械革命Z3 Pro怎么样?测评值得买吗?详细性能点评

机械革命Z3 Pro使用的是一块可自定义RGB的紧凑型全尺寸背光键盘&#xff0c;按键采用侧边全透光设计&#xff0c;让玩家即使在黑暗的环境下也能轻松掌控操作。机械革命Z3 Pro怎么样这些点很重要看过你就懂了 http://www.adiannao.cn/dy 机身A/C面采用的是航空喷砂铝镁合金材质&…