用malloc堆内存探索

时间:2016-07-18 18:25:48

标签: c malloc heap-memory

我已经编写了一个程序,输入中输入3个数字:

    1. 要使用malloc()
    2. 在堆中分配的内存大小
    1. 两个int

如果qunsigned char指针,则会从q[i]=bq[min]提供q[max]

我认为堆被分成页面,第一次调用malloc()会给出一个指向我进程页面第一个字节的指针。那么为什么如果试图获得q[-1]我的进程没有被杀死?

然后我尝试了另一个指针p,我注意到两个指针之间的距离是32byte,为什么它们不相邻?

我注意到的最后一点是p[-8]=q[-40(-32-8)]q[-8]都有数字33 00100001(所有其他字节都设置为0),这意味着什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

  

我认为堆被分成了页面,并且第一次调用malloc会给出一个指向我进程页面的第一个字节的指针。那么为什么如果试着获得q [-1]我的过程没有被杀死?

最有可能的原因是你的malloc实现存储了一些东西。可能是块的大小。

  

然后我尝试了另一个指针p,我注意到在两个指针之间有一个32byte的距离,为什么它们不是邻接?

同样的道理。您的实现可能会在块返回的地址之前将块的大小存储在块中。

  

我注意到的最后一点是p [-8] = q [-40(-32-8)]和q [-8]都有数字33(00100001),它意味着什么?

这可能对您的malloc实施意味着什么。但是如果不看实施,你就无法说出什么。

答案 1 :(得分:0)

标准库在调用main之前使用堆,因此您所做的任何事情都不会在干净的堆上 堆实现通常在分配开始时使用大约2个指针,总大小通常与2个指针对齐 堆实现通常在每个系统分配开始时使用大量字节,有时可能接近页面大小 堆以比页面大得多的块分配,在Windows上它至少有16页 堆可以与其他分配相邻,在Linux上它会在主可执行文件之后出现,因此它不会崩溃而不会崩溃。