很多新手练习malloc都喜欢用一个for循环开辟一个堆空间,大多时候会直接卡死,而有不知道是什么原因造成的。就会很困惑,如果你也有此困惑,那么就耐心的看下去。

一个32位的cpu有32位,八位是一个字节,总共是四个字节,用十六进制表示就是0x00 00 00 00,cpu是通过寻址来操作的,32位(最大数2的32次方)的最大地址值为0xFF FF FF FF,最小地址值为0x00 00 00 00,每一个应用程序都会分到一个4GB(2的32次方)大小的虚拟空间(并不是真实的),这也是为什么32位cpu最大支持4GB的原因。当然了4GB并不都是可用空间,其中操作系统要占用一部分。所以不要盲目的去开辟空间。

下面来看一个简单的开辟空间:

第一次开辟一个char大小的空间第二次开辟一个int大小的空间第三次开辟一个10个int大小的空间

从汇编角度来看(这里不讨论malloc函数是如何执行的):

第一次开辟空间:

esp记录的是栈底的位置
最左侧的是地址值,可以看到是32位(十六进制)mov esi,esp是把esp的值给esipush 1是吧1压入栈中,也证实了char大小是一个字节,push会把esp地址值减4(栈空间是向下增长的)call...是执行了开辟空间的函数add esp,4,地址值加4,恢复堆栈平衡cmp esi,esp查看是否堆栈平衡
call ...这个函数是编译器给我加的,查看堆栈平衡的mov dword ptr [p1],eax 把结果给p1;

第二、三次开辟空间:

可以看到与第一次不同的仅仅是第二行push 后面的数字不同,那么这行代码是什么意思呢?
函数调用前,是通过push来传递参数的,可以看到这三次分别是1、4、28h,正好是这三次开辟空间的大小,28h是16进制,转换成10进制为40.

malloc开辟的空间是以够用为主,而不是越多越好,避免空间浪费。

注意一:

比如说很多人喜欢这么玩,啥也不说,先循环来个100万个,丝毫没有意义

 for (int i = 0; i < 1000000; i++){int* p = (int *)malloc(sizeof(int) * 1000);for (int j = 0; j < 1000; ++j){p[j] = j;}free(p);p=NULL;}

注意二:比如不注意开辟的类型

int *p=(int*)malloc(sizeof*(100));
for(int i=0;i<100;++i)
{p[i]=i;
}
free(p);
p=NULL;
以为强转成为int型指针里面就能够放100个int型数据,结果直接卡死
sizeof()里面放的是字节数,int类型的数据是4个字节,因为100个字节大小只能放50个int数据。所以访问第51个的时候就越界了
因此我开辟时候都是用sizeof(数据类型)*个数来写,清晰明了

注意三:不释放

int *p=(int*)malloc(sizeof*(100));
for(int i=0;i<100;++i)
{p[i]=i;
}
手动开辟的空间必须释放,你不释放的话会一直存在,一直到程序结束.同时一个空间也不能多次释放。

从汇编层次理解malloc函数相关推荐

  1. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

    文章目录 一.分析 malloc 函数的 arm 汇编语言 一.分析 malloc 函数的 arm 汇编语言 在上一篇博客 [Android 逆向]arm 汇编 ( 使用 IDA 解析 arm 架构的 ...

  2. 从汇编角度理解 ebpesp 寄存器、函数调用过程、函数参数传递以及堆栈平衡

    关于函数参数的传递及堆栈指针的变化,一直缺乏系统的认识和了解,各种博客也只是片面的讲解某个局部知识点,并没有全局的把握和对栈的深刻理解.本文试图从汇编以及整体上,讲解函数调用时,堆栈的变化,以及到底是 ...

  3. malloc函数理解

    函数原型为void*malloc(unsigned  size),调用该函数,函数的功能就是在内存分配的动态存储区分配长度为size个字节的内存空间.若申请成功,返回一个 指向 所分配内存空间的起始地 ...

  4. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

  5. c语言malloc函数用法_小白对c语言数组的基础总结

    数组 数组是一系列相同类型元素有序的集合. 数组的定义: 一般形式为: 类型符 数组名 [常量表达式] 如 int a[5]; 表示数组有五个元素,a[0]-a[5],不存在元素a[5]. *注意: ...

  6. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...

    C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...

  7. c理c利用计算机怎么弹,通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的...

    通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 计算机的工作方式: 现代计算机的基本体系结构都是采用冯诺依曼结构,冯诺依曼的设计思想最重要之处是"存储程序"的这个概念 ...

  8. 视频教程-C语言-从汇编角度理解C语言的本质-C/C++

    C语言-从汇编角度理解C语言的本质 擅长JavaWeb开发,游戏逆向外挂与反外挂,游戏保护对抗 孙冉 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅 ...

  9. Glibc:浅谈 malloc() 函数具体实现

    简介 源代码 __libc_malloc() _int_malloc() __libc_malloc() 分析 参数 __malloc_hook 全局钩子 ptmalloc_init 转入 _int_ ...

  10. malloc函数,大大的详解

    很多学过C的人对malloc都不是很了解,知道使用malloc要加头文件,知道malloc是分配一块连续的内存,知道和free函数是一起用的.但是但是: 一部分人还是将:malloc当作系统所提供的或 ...

最新文章

  1. rocketmq中producer设计与实现
  2. 分享一点python 编码设置的知识
  3. java poi读取word中附件_Java POI导入word, 带图片
  4. LeetCode 810. 黑板异或游戏(博弈推理)
  5. alive的不生效 keep vue_webpack打包vue项目 keep-alive不生效
  6. 用C语言编程计算下列表达式:s=1! 2...,2012年全国计算机等级二级C语言模拟试题及答案(3)...
  7. python psutil替代_Python2.7 psutil模块
  8. SQL Server统计信息以及如何在SQL中执行更新统计信息
  9. 计算机三级上机考试题库,计算机三级数据库上机试题及答案
  10. Windows CE的存储与地址映射技术学习
  11. Ubuntu下安装qt57creator-plugin-ros,在QT中进行ROS开发(亲测有效)
  12. Maven使用yuicompressor-maven-plugin打包压缩css、js文件
  13. 『Hammerspoon』Mac 锁屏自动开关蓝牙
  14. 机器学习入门 笔记(二) 机器学习基础概念
  15. 【Hive】Hive练习题(三)
  16. Android开发使用LocationManager实现定位服务
  17. 一个简单的定时任务调度中心设计方案
  18. 视频 | 马云:如果有天阿里不在了,我们也要为世界留下这三样
  19. Rx第三部分--深入序列
  20. H3C DIS命令记录

热门文章

  1. html链接打开excel表格,Excel表格中怎么设置超链接的形式打开其他Sheet工作簿
  2. java语法 chm_使用java代码打开chm格式的帮助文档
  3. JAVA阻止继承:final类和方法
  4. 英语句子摘抄——书虫系列
  5. windows pip install 报错
  6. 修改音频采样率和单双通道
  7. 2019最新IDEA Java教学视频课程资料
  8. 用css做一个梦幻西游动画特效
  9. package.json文件^和~区别
  10. 火车采集器如何采集ajax数据和百度站内搜索数据