目录
前言
动态内存分配是c语言中重要的内容,这是使用c语言实现诸多数据结构的基础之一。下面就来讲解一下主要的内存分配函数。
正文
对于动态内存分配来说,可以分为两类,申请空间和释放空间,主要是三个申请空间的函数和一个释放所申请空间的函数。这四个函数都包含在 stdlib.h 头文件中。
一、 空间申请
对于空间的申请的有以下三个
1. malloc() 向系统申请一块未初始化的空间。
原型: void* malloc (size_t size)
这个函数的参数只有一个,就是要我们输入要申请的空间的大小(单位为字节,建议和 sizeof() 一起使用)。它的返回值是一个无类型的指针, 申请失败返回 NULL, 成功的话这个指针是指向申请来的空间的首地址,我们申请来的空间放我们的数据,必须是要有类型的(不知到为什么的可以参考我的 c语言指针 博客http://t.csdnimg.cn/oDpjq)。所以要用强制类型转换来把它转换为我们想要的类型。(下面有示例)
2.calloc() 向系统申请一块初始化过的空间。
原型: void* calloc (size_t num, size_t size);
相较于 malloc() ,calloc 的不同点有两个,一个是不同于 malloc() 的空间大小写为 单个数据大小 * 数据个数 的模式,多了一个参数,第一参数是数据的个数,第二参数是单个数据的大小(单位为字节,建议使用 sizeof() ),还有一个不同就是 calloc() 申请来的空间是初始化为0之后的。别的都和 malloc() 一样。(下面有示例)
3.realloc() 对申请来的空间大小进行调整。
原型: void* realloc (void* ptr, size_t size);
realloc() 的作用就是对申请来的空间进行大小上的调整,第一个参数就是要调整的空间的指针,第二个参数就是空间大小,和 malloc() 的的空间大小设置是一样的 (如果指针为 NULL 则直接开辟一个这么大的空间)。如果调整成功,就会返回指向空间的起始地址,需要注意的是,在空间变大的时候,如果旧空间之后的空闲空间足够满足空间扩张需要,就仍然返回旧空间的地址,否则就把旧空间的内容拷贝到新空间并返回新空间的地址。如果申请空间失败,就返回 NULL ,且旧空间内容不变。
二、 空间释放
空间的释放就要用到我们的 free() 函数。我们申请来的空间是不会被系统主动释放的,除非该程序结束运行。可是在大型程序里,程序往往是不能随便结束的。如果我们在空间用完后不及时释放空间,我们能使用的空间就是减少。所以必须得及时释放空间。
注意:
1.如果 free() 的参数不是动态内存空间,那free函数的行为是未定义的(也就是可能会发生我们未预料的结果,不要这么做)
2.如果参数是NULL那么函数将什么也不做
(下面有示例)
三、 示例
下面就直接上示例来帮助理解:
下面是 malloc(), calloc() 和 free() 的演示,realloc() 大家可以去尝试看看。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = NULL;
p = (int*)malloc(sizeof(int)*10);
if (p == NULL)//申请失败
{
perror("malloc");//此函数会打印冒号加空格,再跟上错误原因,往其中填入字符串,就会再冒号之前再打印字符串内容
return 1;
}
//申请未失败
int i = 0;
//输出申请来的空间的内容
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
free(p);//在使用完空间之后,一定要记得释放空间,free的参数中填入指向要释放的空间的指针
p = NULL;//动态内存空间释放之后,p会变成野指针,把它置空,防止我们后面不小心访问了野指针指向的空间
p = (int*)calloc(10, sizeof(int));
if (p == NULL)
{
perror("calloc");
return 1;
}
//输出申请来的空间的内容
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
free(p);
p = NULL;
return 0;
}
这个是上面代码的运行结果
结语
以上就是c语言中动态内存分配函数的相关知识,希望对大家有所帮助。最后,别忘了点赞收藏加关注😁