动态内存:动态的创建内存,申请内存空间为变量;存放于堆区,不能通过变量名或数组名引用,只能通过指针引用,在windows中,堆中最大的连续内存块为1.3G左右。
头文件
#include<stdlib.h>
malloc
在空闲内存中分配连续内存,约等于2G,分配成功时返回一个指向该内存块的指针即第一个字节地址,有时需要强转,内存不足时返回空指针,不初始化
int *p=(int*)malloc(n*sizeof(int));
=int p[n]
calloc
初始化为0,功能与malloc相同
函数原型:void*calloc(unsigned n,unsigned size)
int *p=(int*)calloc(n*sizeof(int));
realloc
用于扩大内存或缩小内存,分配新的大内存,需要更新新地址
函数原型:void *realloc(void *p,unsigned size)
int *p=(int*)realloc(p,n*sizeof(int));
free
释放内存空间,解决内存泄漏问题
函数原型:void free(void *p)
free(p);
free崩溃的4个原因
1、越界,漏乘sizeof(尾被破坏)
#include<stdio.h>
#include<stdlib.h>
int main()
{
//int *p1=(int *)malloc(20);error
int *p1=(int *)malloc(20*sizeof(int));
for(int i=0;i<20;i++)
{
p1[i]=0;
}
free(p1);
return 0;
}
2、指针移动(头找不到)
动态内存分配的头部和尾部含有信息,在指针移动的字节的地址发生改变,首字节的地址被p++改变找不到头部
3、重复释放内存
一段内存不能释放两次
4、释放不是动态创建内存