帮助我理解malloc行为..我的代码如下::
int main()
{
int *ptr=NULL;
ptr=(int *)malloc(1);
//check for malloc
*ptr=1000;
printf("address of ptr is %p and value of ptr is %d\n",ptr,*ptr);
return 0;
}
以上程序运行正常(运行没有错误)......怎么样?因为我只用1字节提供了1000的值!!
我是否覆盖了堆中的下一个内存地址? 如果是的话,为什么sigsgev不在那里?
答案 0 :(得分:2)
malloc
的许多实现将以某种“分辨率”分配效率。
这意味着,即使你要求一个字节,你也可能得到16或32个。
然而,这不是你可以依赖的东西,因为它是未定义的行为。
未定义的行为意味着任何都可能发生,包括尽管代码有问题但整个工作仍然有效:-)
答案 1 :(得分:1)
使用调试堆,当你释放内存时,你肯定会遇到崩溃或其他通知(但你没有免费调用)。
分段错误是针对页面级访问冲突的,并且内存页通常大约为4k,因此在一些细粒度检查检测到它或其他部分之前,不可能检测到超出3个字节的溢出。你的代码崩溃了,因为你用'垃圾'覆盖了一些内存