C语言:动态内存分配函数

目录

前言

正文

       一、 空间申请

        二、 空间释放

        三、 示例

​编辑

结语


前言

        动态内存分配是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语言中动态内存分配函数的相关知识,希望对大家有所帮助。最后,别忘了点赞收藏加关注😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值