动态内存管理
局部变量、函数的形式参数存在于栈区;全局变量、静态变量存在于静态区;动态内存分配存在于堆区。
动态内存分配函数介绍
malloc
int* p = (int*)malloc(10* sizeof(int));//向内存中申请10个整形空间,把地址传给p
malloc返回的是void* 强制转换为int*
头文件:#include<stdlib.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{
int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)//必须进行判断,以防非法空间
{
printf("%s\n", strerror(errno));//streeor头文件:string.h error头文件:errno.h
}
else
{
}
free(p);
p = NULL;//当动态申请的空间不再使用的时候利用free函数释放
return 0;
}
free函数:只能释放动态开辟的空间。
calloc
类似于malloc,可以区别可以初始化内存为0.
int* p=(int *)calloc (10,sizaof(int));
realloc
malloc申请一个空间后,觉得不够用了,想再增加空间,这时realloc就发挥了作用
void* realloc (void* memblock,sizeof(size);
realloc(p,40);//把p指向的空间,扩大到40个原先类型的空间,返回类型是void*,为调整之后的内存起始位置。
返回void*地址分几种情况:
一、追加的内存够,返回原先内存的首地址。
二、追加的内存空间不够,重新申请空间,并拷贝原先数据释放内存,返回新地址。
三、如果realloc申请内存失败会返回null,这样的话会修改原地址,因此为了防止此现象得用一个新的变量来接受realloc返回值,使用后必须释放空间
四、对非动态开辟的空间不能使用free释放
五、不能对同一块动态的内存的多次释放
六、不能对动态开辟的内存忘记释放(内存泄漏)
柔性数组
c99中结构体的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员
struct s
{
int n;
int arr[0];//未知大小的——柔性数组成员——数组大小可以调整
};
//使用
int main()
{
struct s* ps = (struct s*)malloc(sizeof(struct s)) + 5* sizeof(int);
ps->n = 100;
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
return 0;
}
柔性数组的优势:1、方便内存释放2、有利于访问速度