从汇编层次理解malloc函数

很多新手练习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大小的空间

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

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

在这里插入图片描述

第一次开辟空间:

esp记录的是栈底的位置
最左侧的是地址值,可以看到是32位(十六进制)

mov esi,esp是把esp的值给esi

push 1是吧1压入栈中,也证实了char大小是一个字节,push会把esp地址值减4(栈空间是向下增长的)

call...是执行了开辟空间的函数

add esp,4,地址值加4,恢复堆栈平衡

cmp esi,esp查看是否堆栈平衡
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值