文章目录
前言
C中动态内存分配相关的三个函数:malloc()、calloc()、realloc()的使用
一、为什么要用动态内存
在c中开辟内存空间有两种方式:
1、静态开辟内存
int a;
int arr[10];
以这种方式开辟内存空间的特点:
(1)所开辟的内存空间是在栈中开辟固定大小的,入a是4字节,数组arr是40字节,并且数组在申明时必须是固定长度的大小,如果数组以以下方式开辟,则会报错。也就是数组的大小在初始化的时候必须给定,如果想在程序运行时才确定一个数组的大小这种方法是行不通的。
int n = 10;
int arr[n];
(2)一般栈的大小是1MB,如果想申请一块大于1MB的连续的内存空间,显然空间不足
此时就需要用另一种方式来开辟内存空间----动态开辟内存。
2、动态开辟内存
静态开辟内存空间的特点恰好就是动态开辟内存空间的优势,还是上面的例子,我们可以在程序运行的过程中确定数组大小,也就是我们可以依据n的大小来申请内存。
二、如何使用动态内存
在C语言中动态开辟空间需要用到三个函数:malloc()、calloc()、realloc(),这三个函数都是在堆中申请内存空间,所用头文件为 #include<stdlib.h> 。
在堆中申请的内存空间不会像栈中存储的局部变量一样,调用完自动释放,需要我们手动释放,用free()函数实现。
1、malloc()
void *malloc(size_t size);
<1> malloc() 函数的头文件还可以使用 #include<malloc.h>
<2> 功能:动态分配一段堆上连续内存但不进行初始化,默认是随机值,并且返回该内存的首地址,该函数不对申请的空间进行清空操作;
<3> 参数:size就是实际所需要的字节数
<4> 返回:返回值的类型是void *, void * 是一个通用类型的指针,可以依据需要进行强转
<5> 结果:
成功:堆上恰好有一块连续的内存可以使用,返回值为该空间的首地址
失败:有可能失败返回NULL
1> 堆内空间不够;
2> 堆内空间足够但是连续空间不足够
// malloc的使用
// malloc(n * sizeof(type)):n表示所需要空间的个数,type表示所需要申请空间的类型
// 动态申请10个空间,每个空间是int类型
int *p = (int *)malloc(10 * sizeof(int));
// 动态申请20个空间,每个空间是char类型
char *q = (char *)malloc(20 * sizeof(char));
// 动态申请100个空间,每个空间是double类型
double *d = (double *)malloc(100 * sizeof(double));
注:malloc()