在C里,内存管理是通过专门的函数来实现。另外,为了兼容各种编程语言,操作系统提供的接口通常是 C 语言写成的函数声明 (Windows 本身也由C和汇编语言写成)。

1 分配内存 malloc 函数

需要包含头文件:

#include

#include

函数声明(函数原型):

void *malloc(int size);

说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:

int *p;

p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

或: 

int* parr;

parr = new int [100];   //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100; 

而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。 

int* p; 

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

第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。

第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成: 

int* p = (int *) malloc (1);

代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。

malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。

比如想分配100个int类型的空间:

int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。

另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。

除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

 

2 释放内存 free 函数

需要包含头文件(和 malloc 一样):

#include

#include

函数声明:

void free(void *block);

即: void free(指针变量);

之所以把形参中的指针声明为 void* ,是因为free必须可以释放任意类型的指针,而任意类型的指针都可以转换为void *。

举例:

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

*p = 100;

free(p); //释放 p 所指的内存空间

或者:

int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。

……

free(p);

free 不管你的指针指向多大的空间,均可以正确地进行释放,这一点释放比 delete/delete [] 要方便。不过,必须注意,如果你在分配指针时,用的是new或new[],那么抱歉,当你在释放内存时,你并不能图方便而使用free来释放。反过来,你用malloc 分配的内存,也不能用delete/delete[] 来释放。一句话,new/delete、new[]/delete[]、malloc/free 三对均需配套使用,不可混用!

int* p = new int[100];

... ...

free(p);   //ERROR! p 是由new 所得。

内存管理(C语言中malloc和free的用法)相关推荐

  1. c语言malloc作用,c语言中malloc是什么?怎么用?

    c语言中malloc是什么?怎么用? malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size); 说明: [参数说明] size 为需要分配的内存空 ...

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

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

  3. Linux内存管理之kmalloc、malloc、vmalloc的区别

    Linux内存管理之kmalloc.malloc.vmalloc的区别 kmalloc和vmalloc分配的是内核空间的内存,malloc分配的是用户空间的内存. kmalloc保证分配的内存在物理上 ...

  4. c语言常量的正确表示const,C语言中的const和free用法详解

    注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...

  5. C++语言中std::array的神奇用法总结,你需要知道!

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...

  6. c语言中if和goto的用法,C语言中if和goto的用法.doc

    C语言中if和goto的用法 C语言中,if是一个条件语句,用法??if(条件表达式) 语句如果满足括号里面表达式,表示逻辑为真于是执行后面的语句,否则不执行(表达式为真则此表达式的值不为0,为假则为 ...

  7. go语言中error的分类与用法

    go语言中error的分类与用法 原文引用:极客时间中的课程<Go error处理最佳实践> 前言:本文要讨论的就是go中error的基本原理/类型,以及最重要的几个问题: go代码开发中 ...

  8. 在c语言中while与do-while,C语言中while /do while语句用法

    C语言中while /do while语句用法 C语言while语句的用法 while语句的一般形式为:while(表达式)语句 其中表达式是循环条件,语句为循环体. while语句的语义是:计算表达 ...

  9. c语言while break用法举例,c语言中continue和break的用法

    目前,随着计算机在人们生活和工作中的普及,其教学研究地位也在逐渐提升.C语言是一种计算机程序设计语言,其具有高级语言和汇编语言的特点.下面小编就跟你们详细介绍下c语言中continue和break的用 ...

最新文章

  1. 2015_8_21作业——有自翻译有复制他人的英语太差
  2. Java开发面试题及答案,5年crud“经验
  3. Spring Boot的学习之路(03):基础环境搭建,做好学习前的准备工作
  4. 项目中要使用到动态规划该怎么应用,怎么说?
  5. 开发使用air还是pro_苹果MacBook全系选购指北,Air和Pro如何选?
  6. 【实数二分/前缀和维护】Best Cow Fences
  7. ubuntu安装tensorflow-gpu 和pytorch
  8. [转载] 微服务安全和治理
  9. linux卸载时提示未安装,Ubuntu 安装卸载软件命令,及出现没有可用软件包提示时的处理办法...
  10. vs 2005 多語言
  11. 使用python将数据存入SQLite3数据库
  12. caffe︱Places365-CNNs For Scene Recognition
  13. 3DMax 卡死、白屏、渲染死机问题总结
  14. 数据库的挂起(suspending)和恢复(resuming)
  15. 聚合购物一站式采购平台HTML网站源码
  16. Laravel之数据库操作与Eloquent模型使用总结
  17. 树莓派学习记录1-树莓派系统烧录与无屏幕网线连接开机
  18. 显示行数 设置ssh终端_SSH终端命令工具:zoc7 for Mac
  19. 多线程系列学习:AQS(一)获取锁
  20. (64)-- 爬取58同城网页信息

热门文章

  1. 重磅发布!36氪2020年度中国最具登陆科创板潜力企业TOP50榜单揭晓
  2. C#程序设计下,网易云课堂,计算机专业
  3. 学习web标准、用户体验改善、Ajaxamp;Asp.Net
  4. 小红书回应行政处罚:因12月央视报道提及未成年信息审核漏放
  5. 越烧钱越上瘾,年轻人为何沉迷「白色鸦片」?
  6. 沃尔沃召回部分进口及国产车 共计131591辆
  7. 3成失眠者放下手机才能睡 说中你了吗?
  8. 全球首发!5G折叠屏笔记本电脑ThinkPad X1 Fold震撼上市
  9. 迷惑行为!淘宝上线新版“相亲名片”:上来先告诉相亲对象你花了多少钱?...
  10. 小米 OV 联合起来才不是为了对抗 Google!