c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别

2023-05-16

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

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

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

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

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

 

举例:

[c-sharp] view plain copy

  1. #include<stdio.h>  
  2. #include<malloc.h>  
  3. int main()  
  4. {  
  5.     char *p;  
  6.    
  7.     p=(char *)malloc(100);  
  8.     if(p)  
  9.         printf("Memory Allocated at: %x/n",p);  
  10.     else  
  11.         printf("Not Enough Memory!/n");  
  12.     free(p);  
  13.     return 0;  
  14. }  

 

 

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

  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, mallocallocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return frommalloc, 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分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别 的相关文章

  • 遍历opencv中的mat像素的几种方法和概念

    今天在看矩形滤波的时候忽然脑子短路 xff0c 把一些概念全弄混了 xff0c 现总结一下 xff0c 以便下次再混的时候可以参考确认下 xff0c 自己的理解 xff0c 有错的地方还请指正 首先 xff0c 在Opencv2中基本上都是
  • C#中的Lock锁深入理解

    lock语句 lock 语句获取给定对象的互斥 lock xff0c 执行语句块 xff0c 然后释放 lock 持有 lock 时 xff0c 持有 lock 的线程可以再次获取并释放 lock 阻止任何其他线程获取 lock 并等待释放
  • C#四种相等性判断方法 equals,referenceEquals

    C 中的ReferenceEquals Equals以及 61 61 C 中有一共有四种相等性判断方法 xff1a Object中定义的三个方法 public static bool ReferenceEquals object objLe
  • C++的Opencv动态库遇到的问题

    1 c 中的位图传入时注意bitmapdata的 stride这个参数 xff0c 步幅 xff0c 图像宽度 通道数 xff0c 必须是整4的倍数貌似 xff0c 待确定 2 某个对象正在在使用的异常 xff0c 用lock锁锁住共享资源
  • C#内存分配概念

    在C 中 xff0c 内存分成5个区 xff0c 他们分别是堆 栈 自由存储区 全局 静态存储区和常量存储区 栈 xff0c 就是那些由编译器在需要的时候分配 xff0c 在不需要的时候自动清楚的变量的存储区 里面的变量通常是局部变量 函数
  • C#中Marshal 类的内存操作的一般功能概述

    Marshal 类的内存操作的一般功能 Marshal类 提供了一个方法集 xff0c 这些方法用于分配非托管内存 复制非托管内存块 将托管类型转换为非托管类型 xff0c 此外还提供了在与非托管代码交互时使用的其他杂项方法 命名空间 Sy
  • C# Marshal的使用,非托管内存中分配内存注意的问题

    IntPtr ptr 61 Marshal AllocHGlobal 704 576 3 如果没有手动释放内存 xff0c 会有内存溢出 xff1b 发生OutOfMemoryException 没有足够的内存继续执行程序时引发的异常 调用
  • Lock锁的问题

    多个线程共用一个锁时 xff0c 同一时间只有一个可获得锁执行 xff0c 其他线程会阻塞进入队列 xff0c 按理解事件如果是多线程的 xff0c 那么每次事件触发的含lock的函数都会将进入队列等待 xff0c 越排越多 需待实验证明
  • SVN的Status字段含义小记

    执行SVN up和svn merge等命令出现在首位置的各字母含义如下 xff1a 无修改 A 新增 C 冲突 D 删除 G 合并 I 忽略 M 改变 R 替换 X 未纳入版本控制 xff0c 但被外部定义所用 未纳入版本控制 该项目已遗失
  • c#中在工作线程创建窗体并操作

    实例1 public void CycleShow 循环绘图 Task Factory StartNew 61 gt threadB 61 new Thread 61 gt AllDealWithSpectrumDicSingle Clea
  • c#绘制星图靶标实例

    public partial class Form2 Form public Form2 InitializeComponent private void button1 Click object sender EventArgs e Ta
  • C#工作线程创建窗体及绘制星图实例

    public partial class Form2 Form public Form2 InitializeComponent private void button1 Click object sender EventArgs e Ta
  • 委托事件的线程问题

    事件注册方法或委托后 xff0c 事件所在的线程执行注册的方法或委托 xff0c 所以如果方法中有跨线程控件就需要使用invoke等处理
  • 怎么判断应用程序是多少位运行的

    C 中 int bitSize 61 IntPtr Size 指针多少字节 if bitSize 61 61 8 MessageBox Show 34 64位程序 34 else if bitSize 61 61 4 MessageBox
  • 图像的色彩类别,灰度化,二值化

    灰度化 xff1a 在RGB模型中 xff0c 如果R 61 G 61 B时 xff0c 则彩色表示一种灰度颜色 xff0c 其中R 61 G 61 B的值叫灰度值 xff0c 因此 xff0c 灰度图像每个像素只需一个字节存放灰度值 xf
  • 服务器与客户端概念

    比如说 xff0c 你浏览百度的网页 xff0c 你的电脑就是客户端 xff0c 而百度网页所存放的机器就是服务器 你通过internet互联网连到百度网页服务器 xff0c 才能浏览网页 再比如说 xff0c 你玩网络游戏 xff0c 你
  • 图像灰度图,直方图,像素通道问题

    1 图像直方图概述 直方图广泛运用于很多计算机视觉运用当中 xff0c 通过标记帧与帧之间显著的边缘和颜色的统计变化 xff0c 来检测视频中场景的变化 在每个兴趣点设置一个有相近特征的直方图所构成 标签 xff0c 用以确定图像中的兴趣点
  • 深入浅出的讲解傅里叶变换(真正的通俗易懂)

    我保证这篇文章和你以前看过的所有文章都不同 xff0c 这是 2012 年还在果壳的时候写的 xff0c 但是当时没有来得及写完就出国了 于是拖了两年 xff0c 嗯 xff0c 我是拖延症患者 这篇文章的核心思想就是 xff1a 要让读者
  • 理解图像傅里叶变换的频谱图

    很多人都不了解图像 xff08 二维 xff09 频谱中的每一点究竟代表了什么 xff0c 有什么意义 一句话解释为 xff1a 二维频谱中的每一个点都是一个与之一 一对应的二维正弦 余弦波 视觉的优势永远大于其他器官对人的作用 xff0c
  • 机器视觉自动数据标注方法

    目录 一 背景阅读 个人总结 xff1a xff08 半 xff09 自动数据标注的方法基本都是采用类似的思路 xff0c 即通过少量标注数据进行训练后得到一个预训练模型 xff0c 然后再次基础上对该网络的输出结果进行人工核验 xff0c

随机推荐

  • 理解图像的傅里叶变换

    最近在看图像的傅里叶变换 xff0c 看着频谱图一直没看明白到底为啥是那样的 xff0c 跟同学研究了好久 xff0c 终于想明白了 感谢同学的耐心指导 xff01 大家相互讨论真的很快就能出结果 xff0c 多讨论 xff0c 多学习 图
  • 快速傅里叶变换(FFT)详解

    快速傅里叶变换 xff08 FFT xff09 详解 xff08 这是我第一次写博 xff0c 不喜勿喷 xff09 关于FFT已经听闻已久了 xff0c 这次终于有机会在Function2的介绍下来了解一下FFT了 快速傅里叶变换 Fas
  • 图像处理:如何理解傅里叶变换在图像处理中的应用

    声明 xff1a 这篇文章的主要目的是通过建立一维傅里叶变换与图像傅里叶变换中相关概念的对应关系来帮助读者理解图像处理中的离散傅里叶变换 xff0c 因此 xff0c 理解图像中离散傅里叶变换的前提条件是读者需要了解一维傅里叶变换的基本知识
  • 图像处理中的傅里叶变换和频率域滤波概念

    写在前面的话 作者是一名在读的硕士研究僧 xff0c 方向是机器视觉 由于视觉是一门相对复杂的学科 xff0c 作者在课堂上学到的东西只是非常浅显的内容 xff0c 我们老师说是 xff0c 领我们进了个门 现在打算利用图书馆和网络上的资源
  • 图像处理的傅里叶变换理解

    傅立叶变换在图像处理中有非常非常的作用 因为不仅傅立叶分析涉及图像处理的很多方面 xff0c 傅立叶的改进算法 xff0c 比如离散余弦变换 xff0c gabor与小波在图像处理中也有重要的分量 印象中 xff0c 傅立叶变换在图像处理以
  • 傅里叶变换分类

    傅里叶变换 傅里叶变换 xff08 Fourier transform xff09 是一种线性的积分变换 xff0c 从时间转换为频率的变化 1 1 连续傅里叶变换 这是将频率域的函数F 表示为时间域的函数f xff08 t xff09 的
  • C++实现二维离散傅里叶变换

    在上一篇文章 C 43 43 实现一维离散傅里叶变换 中 xff0c 我们介绍了一维信号傅立叶变换的公式和C 43 43 实现 xff0c 并阐述了频域幅值的意义 一维傅立叶变换只适用于一维信号 xff0c 例如音频数据 心脑电图等 在图像
  • MFC显示JPG,bmp图片

    主要代码如下 xff1a 方法说明 显示JPG和GIF BMP图片 参数说明 CDC pDC 设备环境对象 参数说明 CString strPath 要显示的图片路径 参数说明 int x 要显示的X位置 参数说明 int y 要显示的Y位
  • MFC关于JPG图片显示处理的几个方式

    做远程视频监控项目 xff0c 接触较多图片处理方面问题 xff0c 作为学习做以下记录 xff1a 一 截图默认bmp格式转jpg压缩 采用jpglib库去实现 二 jpg图片接收后MFC显示 四种方式 MFC提供的CWnd只有默认加载B
  • opencv学 之图像傅里叶变换dft

    一 前言 接触了图像的傅里叶变换 xff0c 数学原理依旧不是很懂 xff0c 因此不敢在这里妄言 下午用Opencv代码实现了这一变换 xff0c 有一些经验心得 二 关键函数解析 2 1copyMakeBorder 扩展图片尺寸 傅里叶
  • UML轻松入门之动态建模

    在UML中 xff0c 静态建模可以描述系统的组织结构 xff0c 而动态建模则可以描述系统的行为和动作 在动态建模机制中 xff0c 以消息完成对象之间的交互 xff0c 用状态图 顺序图 协作图和活动图来描述系统的行为 消息 在面向对象
  • C++实现 (FFT)一维快速傅里叶变换

    一维离散傅里叶变换的公式为 xff1a 如果直接基于该定义进行编程实现 xff0c 则算法时间复杂度为O N2 具体的编程实现我们已经在 C 43 43 实现一维离散傅里叶变换 中介绍过了 当一维信号长度达到几十万个信号时 xff0c 当前
  • 信号傅里叶变换后的实数和虚数部分理解

    傅里叶 xff08 FFT DFT 傅立叶 Fourier xff09 傅里叶变换的结果为什么含有复数 xff1f 为什么傅里叶变换的结果含有复数成份 xff1f 看了很多关于FFT的资料 xff0c 现在看到一个资料说FFT转换的结果是实
  • 从头到尾彻底理解傅里叶变换算法

    http www xuebuyuan com 2052774 html 经典算法研究系列 xff1a 十 从头到尾彻底理解傅里叶变换算法 上 作者 xff1a July dznlong 二零一一年二月二十日 推荐阅读 xff1a The S
  • 一维傅里叶变换后的复数怎样理解?

    我刚开始学傅氏变换也有这样的疑问 xff01 首先回答问题一 xff1a 为什么一个实信号经过傅氏变换后 xff0c 再反变换回来得到的是一个复数 这是由于matlab计算引起的 xff0c 你在计算傅氏反变换后引入了复数 xff0c 最后
  • 二维傅里叶变换是怎么进行的?

    1 首先回顾一下一维FT 通俗来讲 xff0c 一维傅里叶变换是将一个一维的信号分解成若干个三角波 对于一个三角波而言 xff0c 需要三个参数来确定它 xff1a 频率 幅度 A xff0c 相位 因此在频域中 xff0c 一维坐标代表频
  • 傅里叶变换和逆傅里叶变换numpy

    理论基础 时域 xff1a 以时间为横坐标 频域 xff1a 以频率的倒数为横坐标 xff0c 可以看出 xff0c 频域更加简单 相位 xff1a 与时间差有关的一个概念 傅里叶说 xff0c 任何连续周期信号 xff0c 可以由一组适当
  • 复数的物理意义

    很不错的文章 xff01 xff01 复数最直观的理解就是旋转 xff01 4 i i 61 4 就是 4 在数轴上旋转了180度 那么4 i就是旋转了90度 另外 xff0c e t是什么样呢 xff1f 但当你在指数上加上i之后呢 xf
  • 动态初始化一维数组详解

    动态初始化一维数组 1 动态初始化一维数组 xff0c 会在堆内存中分配这个数组 并且数组中每一个元素都采用默认值 byte short int long 0 float double 0 0 boolean false char u000
  • c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别

    一 原型 xff1a extern void malloc unsigned int num bytes 头文件 xff1a include lt malloc h gt 或 include lt alloc h gt 注意 xff1a a