1、学习动态内存分配之前要知道在C语言中内存是怎么使用的。
在C语言中内存被分为三个大块,栈区、堆区、静态区。
栈区主要存放局部变量和函数的形式参数。
堆区主要用于动态内存分配。
静态区主要用于存放全局变量和静态变量。
那么我们知道了动态内存分配是在堆区进行的,下面开始介绍动态内存分配函数。
使用动态内存分配函数需要引用<stdlib.h>文件
1、malloc函数:用于动态内存开辟
语法格式:void* malloc (size_t size);
分配一个大小为size字节的内存块,返回该内存块开头的地址
int * p = (int *)malloc(10 * sizeof(int));
分配一个10个整型大小的内存块,将开头地址传递给p。
如果malloc函数分配内存失败则会返回一个空指针。所以使用时需要进行判断。
#include <stdlib.h>
int main()
{
//分配10个整型大小的内存块,并将地址给p
int * p = (int *)malloc(10 * sizeof(int));
//如果p不为空指针则将0-9存放进内存块中
if (p!=NULL)
{
int i = 0;
for ( i = 0; i < 10; i++)
{
*(p + i) = i;
}
}
}
2、calloc:内存开辟函数
语法格式:void* calloc (size_t num, size_t size);
分配一块内存用于存放num个元素,每个元素大小为size字节,并将其所有初始化为0,将开头地址返回
int * p = (int *)calloc(10, sizeof(int));
分配存放10个整型大小元素的内存块,并将地址给p
同样的,calloc函数如果分配失败也会返回一个空指针,所以使用空间前也需要判断。
#include <stdlib.h>
int main()
{
//分配存放10个整型大小元素的内存块,并将地址给p
int * p = (int *)calloc(10, sizeof(int));
//如果p不为空指针则将0-9写入内存空间
if (p!=NULL)
{
int i = 0;
for ( i = 0; i < 10; i++)
{
*(p + i) = i;
}
}
}
3、free:内存释放函数
通过动态内存分配的内存空间在不使用时要进行释放。
语法格式:void free (void* ptr);
将ptr指向的内存空间进行释放
//分配存放10个整型大小元素的内存块,并将地址给p
int * p = (int *)calloc(10, sizeof(int));
//内存释放
free(p);
p = NULL;
内存释放后,p的地址还是指向原来的内存块,所以也需要将p变为空指针。
4、realloc:调整动态内存的大小
当我们开辟一块空间后不能够满足需求时,可以使用realloc函数进行大小调整
语法格式:void* realloc (void* ptr, size_t size);
更改ptr指向的内存块的大小为size,如果ptr为空指针则相当于malloc开辟空间。
realloc函数调整空间时分为两种情况。
第一:如果原空间后的内存空间足够分配,则直接进行空间追加。
第二:如果原空间后的内存空间不足分配,则重新开辟一块空间,将开头地址返回。
如果内存调整失败则会返回一个空指针。所以使用前需要进行判断。
#include <stdlib.h>
int main()
{
//分配存放10个整型大小元素的内存块,并将地址给p
int * p = (int *)calloc(10, sizeof(int));
//调整内存块大小为20个整型空间
int * q = (int *)realloc(p, 20 * sizeof(int));
if (q!=NULL)
{
p = q;
}
return 0;
}