malloc'd内存和sigsegv

时间:2012-02-09 12:56:40

标签: c linux malloc

帮助我理解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不在那里?

2 个答案:

答案 0 :(得分:2)

malloc的许多实现将以某种“分辨率”分配效率。

这意味着,即使你要求一个字节,你也可能得到16或32个。

然而,这不是你可以依赖的东西,因为它是未定义的行为。

未定义的行为意味着任何都可能发生,包括尽管代码有问题但整个工作仍然有效:-)

答案 1 :(得分:1)

使用调试堆,当你释放内存时,你肯定会遇到崩溃或其他通知(但你没有免费调用)。

分段错误是针对页面级访问冲突的,并且内存页通常大约为4k,因此在一些细粒度检查检测到它或其他部分之前,不可能检测到超出3个字节的溢出。你的代码崩溃了,因为你用'垃圾'覆盖了一些内存