目录

一. 引入

二.malloc()的使用

三.free()函数的使用

四.一些情况

1.如果空间用完了,用malloc()函数和free()函数会发生什么?

2.使用free()函数的误区

五.总结


引入

我们知道,所有的程序都要预够的留足内存才能让程序正常的运行。在之前的学习中,在确定下一种储存的类别后,会根据已经制定好的内存管理规则选择其作用域和储存期,比如语句:

int a[10];

这个语句声明预留了10个内存位置,每一个位置都用于储存int类型的值。假如我们不输入数组的长度,编译器就会报错。但是在一些情况下,我们并不知道数组的实际长度。或者说在数据量比较大时(如a[666]),声明后就将内存安排好了,但是在最后实际没有用到那么多,就造成了内存的浪费。所以需要有一种方法,可以做到更灵活地分配内存的使用。

malloc()的使用

malloc()函数,这个函数接受一个参数----所需要的内存字节数,使用malloc()可以找到内存中闲置区域,按需分配,根据这样的特性,我们就可以将其等价为动态数组a[n]来使用。(C99之前,是不允许n为一个变量)其格式如下:

a=(*int)malloc(number*sizeof(int);

number是一个实参,用来表示想要要输入的某种类型的值(由前面定义)的个数,并且和sizeof()进行乘法运算,malloc()括号里面的全体代表你想要获取的内存字节数。注意,malloc返回值类型为void*,所以要让其成为其他类型,就需要在前面进行强制类型转换(这里是转换为int*型(int*)),知道这些,那么就可以有这样的使用:

#include<stdio.h>
#include<stdlib.h>//也可以是#include<malloc.h>
int main()
{int number
int *a;
int i;
printf("输入数量:");
scanf("%d",&number);
a=(int*)malloc(number*sizeof(int));
for(i=0;i<number;i++)
{scanf("%d",&a[i];}
return 0;}

再注意的是,使用malloc()时,要注意添加头文件,#include<stdlib.h>或者#include<malloc.h>,前者较之后者的涵盖范围更大,可以调用更多的函数。

但是,这个代码仍然有缺陷。安排了一片内存后,如果没有一个指令让其释放,那么空间内总是存在一片地址被占用,长期如此,运行内存就会逐渐下降。这样的问题叫做内存泄漏,比如:

...
int main()
{
double a[666];
int i;
...
for(i=0;i<666;i++)
b(a,666);
}
void b(double a[], int n)
{ double *temp=(double*)malloc(n*8);
...
}

在调用定义好的函数b()的时候,创建了指针temp,并且调用malloc()分配了666*8个字节的内存。当函数结束后,自动变量*temp就销毁了,但是其指向的字节仍然占用,而且因为指针的销毁,就无法访问这片内存。这片代码还有循环语句,再一次执行循环体时,又会创建*temp,又调用另一片字节数为666*8的内存,又一次无法在被使用的内存,这样的指令执行666次,或者在执行之前内存用尽,造成难以处理的问题。所以在这个时候就需要用到free()函数了。

free()函数的使用

free()函数的参数是之前malloc返回的地址,用于释放之前malloc分配的内存。就如上面的代码,在return 0;的上方加上free(a);就可以将内存归还给内存池中,也是为下一次使用这些内存做准备。注意,要使用free()时也需要有头文件#include<stdlib.h>

一些情况

如果空间用完了,用malloc()函数和free()函数会发生什么?

可以用代码来验证一下(将100兆的空间给p)

#include<stdio.h>
#include<stdlib.h>
int main()
{void *p;int i=0;
while(p=malloc(100*1024*1024))
i++;
printf("%d",i);
return 0;
}

运行结果为 0或NULL;并且会告知你申请内存失败,free()就更谈不上了。

使用free()函数的误区

先看下面两段代码:

#include<stdio.h>
#inlcude<stdlib.h>
int main()
{
int i,n=0;
void *p;
p=&i;
free(p);
}
#include<stdio.h>
#inlcude<stdlib.h>
int main()
{
void *p;
p=malloc(666);'
p++;
free(p);
return 0;
}

在运行后,系统都会有同一个反应pointer being freed was not allocated.

即我们需要释放的指针没被分配(不是申请来的)。

第一个代码的错误在于p不是由malloc()来的,不能使用free()。

第二个代码是进行了p++,地址发生变化。

所以说,系统会记住你的申请,在使用时要原封不动地归还。

总结

1.malloc()函数可以实现和动态数组等价的效果。

2.free()函数可以将malloc()函数申请来的空间释放。

3.malloc()函数常常和free()函数一起使用。

4.使用free时要注意地址的变动。

malloc()函数与free()函数的使用相关推荐

  1. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...

  2. malloc,calloc,realloc,free函数

    在进行C/C++编程的时候,需要程序员对内存的了解比较清楚,经常需要操作的内存可分为下面几个类别: 1.堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取 ...

  3. C++malloc,calloc,realloc,free函数

    在进行C/c++编程的时候,需要程序员对内存的了解比较清楚,经常需要操作的内存可分为下面几个类别:     1.堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等, ...

  4. c语言中alloc作用,C语言内存分配 :malloc()函数与alloc()函数

    C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变 ...

  5. C语言中malloc函数及free函数用法(定义动态数组及释放)

    一.关于静态数组.动态数组 二.malloc()和free()的基本概念以及基本用法 1.函数定义 2.函数用法 3.关于函数使用注意事项 三.malloc()函数分配内存空间的由来 四.malloc ...

  6. 关于 malloc 函数和free 函数

    原文链接:http://blog.csdn.net/zhangxaochen/article/details/8052128 1. malloc 函数原型 void* malloc(unsigned ...

  7. malloc函数及memset函数用法详解

    最近在力扣刷题时,发现普通的创建数组很容易引起编译器报错. 而使用到动态内存分配malloc()函数和初始化函数memset()可以避免这类问题的发生.本文将详细介绍一下两个函数的 malloc() ...

  8. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

  9. 用Debug函数实现API函数的跟踪

    用Debug函数实现API函数的跟踪 如果我们能自己编写一个类似调试器的功能,这个调试器需要实现我们对于跟踪监视工具的要求,即自动记录输入输出参数,自动让目标进程继续运行.下面我们就来介绍在不知道函数 ...

  10. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )

    文章目录 一.mmap 简介 二.mmap 函数作用 一.mmap 简介 mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件 : ...

最新文章

  1. 1-趣味解读DNS工作原理——转载疯猫网络科技
  2. 【机器学习基础】5种数据同分布的检测方法!
  3. 谷歌(Google Chrome)插件安装
  4. C语言 socket
  5. Android 使用Webview时,有时抛 java.lang.Throwable: EventHub.removeMessages(int what = 107) warning...
  6. Python正则表达式详解
  7. RetinaNet算法详解及其在垃圾检测中的应用
  8. 那些年Android黑科技②:欺骗的艺术
  9. 逆向工具IDA下载网址
  10. 网络操作系统VyOS之NAT实践
  11. 分享五款好用的PDF编辑工具
  12. 百度搜索热点热搜怎么关闭?
  13. pdf文件加水印输出图片
  14. 如何用Python画出玫瑰曲线和蝴蝶曲线
  15. linux内核不能识别u盘分区,一种在Linux内核中识别特定USB大容量存储设备的方法及系统与流程...
  16. springboot考研规划系统 毕业设计-附源码541230
  17. 高数 02.04隐函数的导数
  18. OSGi模块化框架详解
  19. google glog使用指南
  20. 实现输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

热门文章

  1. c++中获得对象类型 typeid 与 type_info
  2. One-Hot Encoding
  3. 医院信息科结构化面试
  4. 华为交换机关闭服务端口
  5. Java的长整型Long/long后面的数字什么情况下必须加L?
  6. 看不到 虚拟打印机 adobe pdf printer
  7. 状态压缩Dp模板-玉米田
  8. Ubuntu 启动盘制作教程
  9. Flask_从入门到放弃?不!!!从入门到入土!!
  10. 家园防线 | 斐乐的手敲大型庭院物联网灌溉系统(持续更新)