前言:Hello大家好😘,我是心跳sy,今天为大家带来malloc函数与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函数的知识我们在下期文章为大家带来,感谢大家花费宝贵的时间阅读本文章,制作不易,希望大家多多支持呀😘😘😘,如有任何问题欢迎各位大佬在评论区批评指正!!!