很多新手练习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的值给esi
push 1是吧1压入栈中,也证实了char大小是一个字节,push会把esp地址值减4(栈空间是向下增长的)
call...是执行了开辟空间的函数
add esp,4,地址值加4,恢复堆栈平衡
cmp esi,esp查看是否堆栈平衡