malloc函数详解

一、原型:extern void *malloc(unsigned int num_bytes);

头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

 

举例:

#include<stdio.h>
#include<malloc.h>
int main()
{char *p;p=(char *)malloc(100);if(p)printf("Memory Allocated at: %x/n",p);elseprintf("Not Enough Memory!/n");free(p);return 0;
}

二、函数声明(函数原型):

  void *malloc(int size);

  说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。这个在MSDN上可以找到相关的解释,具体内容如下:

     

malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.

三、malloc与new的不同点

  从函数声明上可以看出。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得到指针,在其它操作上保持一致。

 

 总结:

malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。

备注 :本文转自 :http://blog.csdn.net/xw13106209/article/details/4962479 ,感谢他的精彩分享!

转载于:https://www.cnblogs.com/xd-elegant/p/4147947.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ 航空管理系统_浅谈航站楼能源管理系统的设计与应用

蒋超萍江苏安科瑞电器制造有限公司 江苏江阴 214400 【摘要】根据航站楼的特点&#xff0c;从航站楼能源消耗现状、能源管理系统的功能、系统架构、子系统以及能源的优化调度方案五个方面介绍了航站楼能源管理系统的设计&#xff0c;并对节能效果进行了预测。关键词&#xff1a…

mysql 线性表_线性表之顺序存储,基本操作

/*九大基本操作(不同的存储结构实现的代码不同)此处用一维数组的动态分配&#xff1a;InitList(&L);//初始化表&#xff0c;Length(L);LocateElem(L,e);GetElem(L,i);ListInsert(&L,i,e);ListDelete(&L,i,&e);PrintList(L);Empty(L);DestoryList(&L);*//*静…

mac python安装太慢_【已解决】Mac中给pip3添加代理以提升下载python包的速度

折腾&#xff1a;【未解决】Mac中Python 3.7安装TensorFlow期间&#xff0c;用&#xff1a;pip3 install tensorflow期间会去从下载python包此处连接files.pythonhosted.org的速度很慢。而自己有代理可用。所以想办法去给pip3或pip用上代理&#xff0c;加速下载mac pip3 use pr…

集合数据源

集合数据源主要包括ArrayList,Hashtabel,DataView,DataReader转载于:https://www.cnblogs.com/handsomer/p/4150400.html

LeetCode 1785. 构成特定和需要添加的最少元素(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。 数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 &#xff0c;添加元素 不应改变 数组中 …

insert和update 锁等待_黑龙F5智感双全智能锁全球首发,掀起惊艳风潮

2020备受瞩目重磅新品 —— 黑龙F5智感双芯智能门锁&#xff0c;正式官宣&#xff0c;革新行业的智感解锁交互&#xff0c;强大的双芯片双智控&#xff0c;再次掀起惊艳风潮。双芯片科技感交互&#xff0c;领行业新风向黑龙F5智能锁前沿性地配备双芯片&#xff0c;以双核分别掌…

java喷泉编码_好程序员Java教程分享使用JS实现简单喷泉效果

原标题&#xff1a;好程序员Java教程分享使用JS实现简单喷泉效果好程序员Java教程分享使用JS实现简单喷泉效果&#xff0c;最近&#xff0c;在教学生使用JS的基本操作&#xff0c;为了练习JS的基本作用&#xff0c;特地写了一个喷泉效果&#xff0c;代码如下&#xff1a;页面代…

python 类继承 父类初始化_python之子类继承父类时进行初始化的一些问题

直接看代码&#xff1a;classPerson:def __init__(self):self.name "jack"classStudent(Person):def __init__(self):self.school "一中"stuStudent()print("学生的姓名是:",stu.name)此时&#xff0c;程序是不能正常运行的&#xff0c;运行之后…

『WPF』实现拖动文件到窗体(控件)

前言 实现从窗口外部拖文件到窗口内部并自动捕获文件地址。 第一步 开启属性 启用底层Window的AllowDrop属性&#xff0c;添加Drop事件。 Drop事件&#xff1a;当你拖动文件到对应控件后&#xff0c;松开触发。 除Drop事件外&#xff0c;我们还可以使用DragEnter、DragOver、Dr…

怎么更改苹果账户名称_番茄todo小组件背景怎么改 苹果番茄todo小组件背景更改方法介绍...

番茄todo小组件背景怎么改&#xff0c;这也是大家会用到的一款倒计时APP&#xff0c;那么用户们应该怎么更改小组件的背景图片呢&#xff0c;可能还有些人不知道更改的方法。所以这里就为大家带来了具体的步骤!番茄todo小组件背景怎么改1.在打开APP后&#xff0c;如没有待办事项…

LeetCode 1786. 从第一个节点出发到最后一个节点的受限路径数(迪杰斯特拉 + 拓扑排序)

文章目录1. 题目2. 解题1. 题目 现有一个加权无向连通图。 给你一个正整数 n &#xff0c;表示图中有 n 个节点&#xff0c;并按从 1 到 n 给节点编号&#xff1b;另给你一个数组 edges &#xff0c;其中每个 edges[i] [ui, vi, weighti] 表示存在一条位于节点 ui 和 vi 之间…

java选择题多选题系统小程序_单选题与多选题判断得分(自动考试小程序,入门级)...

【单选题与多选题判断得分】【核心代码】using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace 自动…

用python开启相机_如何用Python打开realsenseD435相机并获取相机参数

如何用Python打开realsenseD435相机import pyrealsense2 as rsimport numpy as npimport cv2if __name__ "__main__":# Configure depth and color streamspipeline rs.pipeline()config rs.config()config.enable_device_from_file("666.bag")#这是打开…

Sicily-1063

一&#xff0e;题意 一个员工是另外一个员工的老板必须满足的条件是作为老板的员工的薪水salary必须大于这个员工&#xff0c;而且作为老板的员工的身高height要大于等于这个员工。首先按照薪水的多少从小到大进行排序&#xff0c;然后找每一个员工的直属老板。注意老板的下属的…

流畅的Python 1. Python数据模型(特殊方法 __func__())

文章目录1. __getitem__()、__len__() 方法2. 特殊方法1. __getitem__()、__len__() 方法 举一个扑克牌的例子 import collectionsCard collections.namedtuple(Card_name, [rank, suit]) print(Card.__doc__) # Card_name(rank, suit)class FrenchDeck:ranks [str(n) for …

diskfileitemfactory 需要的包_浅析电动汽车电池包低压线束设计及制造

点击上方右侧“EDC电驱未来”可订阅哦&#xff01;般的电池包低压线束承载着模组通信、模组采样和电池管理等功能。电池包低压线束一般分为模组通信线束、模组采样线束、BMS线束等。这里结合实际工作中的经历和遇到的困扰&#xff0c;主要分析和探讨SUV纯电动汽车电池包低压线束…

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

[顶]ORACLE PL/SQL编程详解之二&#xff1a;PL/SQL块结构和组成元素(为山九仞&#xff0c;岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二&#xff1a;PL/SQL块结构和组成元素(为山九仞&#xff0c;岂一日之功)[顶]ORACLE PL/SQL编程详解之二&#xff1a; PL/SQL块结构和组成…

xgboost实例_XGBoost超详细推导,终于有人讲明白了!

- XGB中树结点分裂的依据是什么&#xff1f;- 如何计算树节点的权值&#xff1f;- 为防止过拟合&#xff0c;XGB做了哪些改进&#xff1f;相信看到这篇文章的各位对XGBoost都不陌生&#xff0c;的确&#xff0c;XGBoost不仅是各大数据科学比赛的必杀武器&#xff0c;在实际工作…

修改dts后重编译_「正点原子FPGA连载」第二十章另一种方式编译ZYNQ镜像

1)摘自【正点原子】领航者 ZYNQ 之linux驱动开发指南2)实验平台&#xff1a;正点原子领航者ZYNQ开发板3)平台购买地址&#xff1a;https://item.taobao.com/item.htm?&id6061601087614)全套实验源码手册视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.ht…

流畅的Python 2. 数据结构 - 序列构成的数组

文章目录1. 内置序列2. 列表推导 []、生成器() 表达式3. 元组 tuple4. 切片5. , * 操作6. 增量赋值7. 排序8. bisect管理已排序序列8.1 用 bisect.bisect 二分搜索8.2 用 bisect.insort 二分插入新元素9. 列表的替代9.1 数组9.2 内存视图9.3 NumPy、SciPy9.4 队列1. 内置序列 …