为什么要存在动态内存分配呢?在这之前我们已经掌握了定义一个整形变量就是在栈上开辟四个字节,定义一个数组就是在栈上开辟一段来内需的空间。这两种开辟空间的方式有两个特点:
1.空间开辟大小是固定的。
2.数组在申明的时候,必须指明数组的长度,它所需要的内存在编译时分配。
以上两种方式开辟空间的大小都是在编译时开辟的,但有时候需要开辟空间的大小在程序运行时才能知道,所以便需要动态内存开辟空间。
动态内存分配需要专门的函数来实现这一功能:malloc和free
首先来说一下malloc:
这里需要注意的是,malloc申请开辟的空间比需要空间大小要大,多出来的空间用来保存空间大小等其他信息。(适用于申请大块的空间)
函数原型: void *malloc(size_t size) 可以看出malloc开辟空间是按字节开辟的。
开辟结果:成功 ———>返回指向该空间的指针
失败 ———>返回NULL
使用malloc时返回值需要检查
free则是用来释放动态开辟的内存,malloc申请的空间如果不被free释放则会出现内存泄漏的问题。
具体怎么用,看下面代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
int main()
{
int num = 0;
scanf("%d", &num);
int *ptr = NULL;
ptr = (int *)malloc(num*sizeof(int));
if (NULL != ptr)//判断ptr是否为空
{
int i = 0;
for (i = 0; i < num; i++)
{
*(ptr + i) = 0;
}
}
free(ptr);//释放动态内存空间
ptr = NULL;
return 0;
}
除了malloc之外还有calloc和realloc可以申请开辟动态内存空间,所不同的时,calloc会将申请的空间全都初始化为0,realloc则可以对申请的动态内存空间的大小进行调整。