深圳福田区网站建设,企业宣传网站建设需求说明书,做电子杂志用什么网站,苏州搜狗关键词优化目录
本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 动态内存管理—自己维护自己的内存空间的大小 首先我们申请一个变量#xff0c;再申请一个数组 这是我们目前知道的向内存申请…目录
本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 动态内存管理—自己维护自己的内存空间的大小 首先我们申请一个变量再申请一个数组 这是我们目前知道的向内存申请空间的一种方法
但是这两种申请空间大小的方法有一个问题就是他的内存大小是不能被改变的
那么我们今天就引入动态内存分配这个知识点
首先我们来看一下malloc这个函数 Allocate memory block:开辟内存空间块
size_t sizesize表示我要划分的字节这40个字节有自己的起始位置把起始位置的地址给你返回来这40个字节的用途是不确定的所以返回为void*我们按照自己想要的类型进行强制类型转换那么我们有没有申请空间的时候申请失败如果我的内存总共就8个G/16个G,所以一旦开辟失败就返回空指针NULL
现在我们来看代码malloc函数如何使用
#define CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#includestring.h
#includestdlib.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
#includestdio.h
#includestring.h
#includestdlib.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就好像是一条野狗我们可以拿一根绳子把它拴在树上希望大家能够理解
但是嫩你只顾申请但是不释放这样就可能会导致内存泄漏的问题给大家写一个死循环的开辟内存的代码
当然我的电脑比较落后一点所有设施都稍微要落后一点所以当时我运行起来就有一点卡浏览器就被卡出去了其实内存泄漏是非常危险的感兴趣可以尝试一下运行起来代码打开任务管理器可以发现他达到一定程度就会稳定下来说明现代的电脑是非常聪明的
#includestdio.h
int main()
{while (1){malloc(1);}return 0;
} 本章终