动态内存管理
本章重点
为什么存在动态内存分配?
动态内存函数的介绍
malloc
free
calloc
realloc
常见的动态内存错误· 几个经典的笔试题·柔性数组
一.为什么存在动态内存分配?
我们已经学到的开辟空间的方法:
int a;
int arr[100];
单个开辟空间或者连续开辟空间;
在数组的定义声明时需要写出空间的大小但是这样的方法不够灵活和方便;
比如int arr[100]当我们想要存放120组数据时空间不够也不能改变空间;
但我们存放80组数据时又存在空间的浪费;(在实际情况下不清楚空间的使用情况)
这个时候C语言就赋予了我们开辟动态内存空间能力;(可以改变内存空间);
二.动态内存函数的介绍
malloc(包含于头文件stdlib.h中)
void* malloc(size_t size):
函数用来想内存申请空间;
该函数参数size是要开辟空间的字节大小;返回一个void*指针指向开辟空间的起始位置;
为什么是void*类型的指针?
因为函数在设计的时候不知道未来使用者会拿开辟的空间存放什么类型的数据;
void* 可以接收任意类型的指针;只是在使用的时候需要强制类型转换;
函数在申请空间时理论上存在申请失败的情况:当我们的内存只有8G时使用malloc函数申请1T的空间
一定会失败;失败时返回空指针;
malloc函数的使用
#include<errno.h>
#incluae <string.h>
#include <stdlib.h>
#include<stdio.h>
int main()
{
//常规开辟内存
int arr[10] = {0};
//动态内存开辟
int* p = (int*)malloc(40);
if (p == NULL)
{
printf("%s\n", strerror(errno));//errno全局变量包含于头文件errno.h中;
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
//并不是说内存空间就不回收了
//当程序退出的时候,系统会自动回收内存空间的
//如果程序一直运行我们申请的空间没有使用也没有释放;长时间的程序运行会存在内存泄漏;
//所以相对正确的操作是:
free(p);
p=NULL;
//释放p所指向的内存空间(我们申请的内存空间一直用p来操作所以释放它就是释放我们申请 //的空间);通过监测内存空间我们发现当我们释放内存之后p仍然指向刚才的地址;
//所以可以说虽然释放了空间;其他数据可以申请该段空间;但是在后续的使用中仍然可以通过p找到
//这段空间;存在一定的危险性;所以需要p赋值NULL;
return 0;
}
malloc申请free释放这是一对配套函数尽量成对出现;
失败操作:
int* p=(int*)malloc(INT_MAX);
INT_MAX表示整形的最大值21亿多;
这个时候内存空间一定申请失败;
我们的内存空间分为栈区堆区和静态区;
我们常规的申请空间int arr[110];申请的是栈区上的空间;栈区的空间不能随意改变;
malloc函数申请的是堆区上的空间;
int main()
while (1){
malloc(1);
}
return 0;
}
上述代码会不断想内存申请空间导致电脑死机;
标签:malloc,int,申请,内存空间,C语言,学习,动态内存,空间 From: https://blog.csdn.net/dametime_/article/details/139157800