我已经编写了一个程序,输入中输入3个数字:
malloc()
int
值如果q
是unsigned char
指针,则会从q[i]=b
向q[min]
提供q[max]
。
我认为堆被分成页面,第一次调用malloc()
会给出一个指向我进程页面第一个字节的指针。那么为什么如果试图获得q[-1]
我的进程没有被杀死?
然后我尝试了另一个指针p
,我注意到两个指针之间的距离是32byte,为什么它们不相邻?
我注意到的最后一点是p[-8]=q[-40(-32-8)]
和q[-8]
都有数字33 00100001
(所有其他字节都设置为0),这意味着什么?
谢谢!
答案 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上它会在主可执行文件之后出现,因此它不会崩溃而不会崩溃。