1.malloc
2.calloc
3.realloc
4.free
为什存在动态内存
一掌握的内存开辟方式:int val=20;char arr[10]={0};
- 特点:空间开辟大小是固定的。
- 数组在申明的时候,必须是指定数组的长度,它所需的内存在编译时分配。
动态内存函数的介绍;
1.malloc-开辟内存块
void* malloc(size_t size)
#include<errno.h>
#include <string.h>
int main()
{
int arr[20] = { 0 };
//动态内存
int *p=(int*)malloc(40);//INT_MAX;
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
//并不意味内存空间不回收了
//当程序退出的时候,系统会自动回收内存空间
free(p);//释放P的空间,p的指向不改变,会变成野指针
p=NULL;//所以要使P指针变空
return 0;
}
如果空间没有释放,会导致空间泄露,程序开辟的空间没有在用,别人也用不了,就会导致空间的丢失,造成空间泄露
当死循环的开辟空间,理论上会导致空间的无限开辟,在过去的电脑中,会导致空间不断被开辟,直至死机,而现代电脑会阻止空间的不断开辟。当出现跑的程序内存不断减少,重新开机有恢复正常,跑的时候又开始减少,就有可能是内存泄漏的问题。
int arr[10]与malloc空间上的区别:
2.free-释放内存空间
free(p=NULL);
//这样的写法会先赋值再释放内存空间,可是p已经是空指针了,已经找不到内存空间了
3.calloc -动态内存开辟函数
特殊:开辟空间会同时初始化。
void* calloc(size_t num,size_t size)
num--开辟几个元素
size--元素的大小
4.realloc-让动态内存管理更加灵活。
prt---要修改调整的空间起始地址
size---新的空间大小。