静态分配
在程序编译或运行的过程中,按事先规定大小分配内存空间的分配方式,必须事先知道所需的空间大小,分配在栈区或全局变量区,一般以数组形式存在,按计划分配。
动态分配
在程序运行过程中,根据需要的大小自由分配所需的空间,按需分配,分配在堆区,一般使用特定的函数进行分配
动态分配函数
需要包含#include <stdlib.h>
malloc函数
在内存的动态存储区中分配一块长度为size字节的连续区域用来存放类型说明符指定的类型。
void* malloc(unsigned int size);
分配成功返回分配空间的起始地址,分配失败返回NULL,在调用malloc函数之后一定要判断一下是否分配成功,如果多次malloc申请内存,第一次和第二次申请的内存不一定是连续的。
int i, * array, n;
printf("输入要申请的数组元素个数\n");
scanf_s("%d",&n,4);
array = (int*)malloc(n * 4);
if (array == NULL) {
printf("申请内存失败\n");
return 0;
}
for (int i = 0; i < n; i++) {
array[i] = i;
}
free函数
释放内存
void free(void* ptr)
ptr指向的内存必须是由malloc calloc relloc 动态申请的内存。
free(array);
free之后,因为没有给array赋值,所以array还是指向原先动态申请的内存,但是内存已经不能再用了,所以array变成野指针了。一块动态申请的内存,只能释放一次,不能多次free。
calloc函数
void * calloc(size_t _Count,size_t _Size)
size_t 是无符号整型,是在头文件中用typedef定义出来的。在内存的堆中,申请_Count块,每块的大小为_Size个字节连续的区域,分配成功返回分配空间的起始地址,分配失败返回NULL。
char* p = (char*)calloc(3, 100);//申请3块,每块大小是100字节,300个字节是连续的
array = (int*)calloc(n *,4);
malloc函数和calloc函数区别
- 函数名字不一样;
- 参数个数不一样;
- malloc申请的内存,内存中存放的内容是随机的,calloc申请的内存中存放的内容是0。
realloc函数
重新申请内存
void* realloc(void* _Block, size_t _Size)
在原先s指向的内存的基础上重新申请内存,新的内存大小_Size个字节。如果原先的内存后面有足够大的内存就追加,如果后面内存不够用就在堆区中找一个_Size个字节大小的内存申请,将原先内存中的内容拷贝过来,释放原先的内存,然后返回新内存的地址。如果新内存的大小比原先内存小,就释放掉原先内存的后面的存储空间,只留_Size个字节大小的空间。
p = (char*)realloc(p, 150);
内存泄漏
申请的内存,首地址丢了,没法使用也没法释放,这块内存就被泄露了。