malloc与free函数的用法(精简全面 · 一看即懂)

前言:Hello大家好😘,我是心跳sy,今天为大家带来malloc函数与free函数的用法,我们一起来看看吧!

目录

一、malloc函数 💫

1、⭐️malloc函数对应的头文件⭐️

2、⭐️malloc函数的作用⭐️

3、⭐️malloc函数的参数与使用⭐️

二、free函数 💫

1、⭐️free函数对应的头文件⭐️

2、⭐️free函数的作用⭐️

3、⭐️free函数的参数及使用⭐️

⭐️场景设想:我们在编写代码时经常会遇到这样一种情况:我们无法预知确定某些数据结构的大小,比如将一串整数输入到一个数组之中,我们无法得知将要输入多少个整数,比如需要输入n个数据,数组的大小只能在程序运行过程时才能确定,怎么办呢❓

💫这时就需要调用malloc函数为这个数组分配动态的内存空间,这部分空间来自进程地址中的堆段,用完之后需要调用free释放。

👉我们看一个小例子:

#include<stdlib.h>
#include<stdio.h>
//动态分配内存并读取用户输入的整数
int main()
{
	int* array, i, n;
	scanf("%d", &n);
	array = (int*)malloc(sizeof(int) * n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &array[i]);
	}
	free(array);
	return 0;
}

🌈解释:这段代码控制输入 n 个整数,根据要输入的个数来动态分配内存,使用 malloc() 函数动态分配了一个包含 n 个整数的数组,返回值是一个指向整数的指针 (int*),将其赋值给 array ;for 循环用于遍历数组 array,从标准输入中读取 n 个整数,将其存储到数组 array 的第 i个元素中;最后使用 free()函数释放动态分配的内存,避免内存泄漏。

一、malloc函数 💫

 

1、⭐️malloc函数对应的头文件⭐️

👉malloc函数对应的头文件是stdlib.h,许多的c编译器也支持使用malloc.h,两种都可以使用,但为了确保代码的可移植性和兼容性,我们还是推荐使用stdlib.h

2、⭐️malloc函数的作用⭐️

👉可动态申请一段空间 ,分配一块大小为 size 字节的内存块,并返回该块的起始地址的指针

3、⭐️malloc函数的参数与使用⭐️

👉在上图中,我们可以看到malloc函数的原型为 void* malloc (size_t size),首地址返回void*,我们可以将其转换成任意类型去使用,比如我们代码中返回了(int*),函数参数为要申请的字节数,比如:

int* p = (int*)malloc(sizeof(int) * 4);

⭕️int类型是4字节,代码意为申请4个int类型的空间,共分配4*4=16字节

⚠️注意malloc函数分配的是一段连续的空间,所以呢我们可以把这个一维空间当成数组去使用,例如我们上面给出的代码所示。

⭕️在实际编写代码中,我们在分配好地址后,常常需要验证地址空间是否分配好了,需要判断一下:

int* p = (int*)malloc(sizeof(int) * 10);
if (p == NULL)
{
	printf("动态内存分配失败!");
	return 0;
}

二、free函数 💫

1、⭐️free函数对应的头文件⭐️

👉仍然是 stdlib.h,与malloc函数一致。

2、⭐️free函数的作用⭐️

👉释放内存块,通过调用 malloc、calloc 或 realloc 分配的内存块释放,使其可以再次用于其他分配。

3、⭐️free函数的参数及使用⭐️

👉参数是void*类型的指针,也就是我们上方malloc申请的那块空间的首地址传进去,就可以进行释放了,如下:

free(p);

⚠️注意:free函数用于释放我们的三兄弟函数:malloc、calloc 或 realloc ,它们之间成对出现,如:一个malloc下面必须有一个对应的free✔

🔴如果 ptr 指针不是用上述三兄弟函数分配的内存块,则会导致未定义的行为!

🔴如果 ptr 是一个空指针,则函数不执行任何操作

🔴释放完空间之后,空间释放掉了,但是地址值还在p里保存着,我们通常置指针为空,防止野指针的产生,即

free(p);
p = NULL;

👉关于calloc函数和realloc函数的知识我们在下期文章为大家带来,感谢大家花费宝贵的时间阅读本文章,制作不易,希望大家多多支持呀😘😘😘,如有任何问题欢迎各位大佬在评论区批评指正!!!

 

  • 37
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值