帮助我理解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 %dn",ptr,*ptr);
return 0;
}
上面的程序运行良好(运行时没有错误)。。。怎样因为我只提供了一个1字节的值1000!!
我是否正在覆盖堆中的下一个内存地址?如果是的话,那么西格夫为什么不在那里呢?
malloc
的许多实现都会以一定的"分辨率"进行分配以提高效率。
这意味着,即使您请求一个字节,您也很可能得到16或32。
然而,它不是你可以依赖的东西,因为它是未定义的行为。
未定义的行为意味着任何都可能发生,包括整个事情,尽管代码有问题:-)
使用调试堆,释放内存时肯定会收到崩溃或其他通知(但您没有调用free)。
分段错误是针对页面级访问违规的,内存页面通常约为4k,因此在一些细粒度检查检测到之前,不太可能检测到3字节的溢出,或者因为您用"垃圾"覆盖了一些内存而导致代码崩溃。