2012-02-09 112 views
1

帮助我理解malloc的行为..我的代码如下::malloc分配内存和SIGSEGV

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在那里?

+1

的行为是不确定的,整个事情,所以它可能会或可能不会崩溃。在某些实现中,当你释放(ptr)时,程序会崩溃。 – 2012-02-09 13:02:09

+0

它需要用包装做点什么吗?通常使用32位应用程序进行4字节的默认打包。 – 2012-02-09 13:02:22

回答

1

使用调试堆,当您释放内存时(但您没有拨打免费电话),您肯定会收到崩溃或其他通知。

分段错误是针对页面级访问冲突的,而内存页面通常是4k的数量级,所以3个字节的溢出不太可能被检测到,直到更细粒度的检查检测到它或其他部分的代码崩溃,因为您用'垃圾'覆盖了一些内存

2

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

这意味着,即使你为一个字节,你很可能已经得到了16或32

然而,这是不是你可以依赖,因为它是不确定的行为。

未定义行为意味着什么可以发生,包括尽管有问题的代码工作:-)

+0

先生,(可能是这个愚蠢的问题..但我需要问).. 什么是“许多malloc的实现”? 所有那些使用gcc n glibc的人(从标准网站下载..)实现/定义必须相同...... na ?? n 是否有像malloc,free等函数的标准定义? – saurabh 2012-02-09 13:23:40

+0

@saurabh:是的,gcc(或mor正确glibc)可能有一个特定的实现,但这不是唯一的一个。 MSVC有它自己的,IBM的xlc有另一个等等。 GLibC只是一个实施。 ISO C标准指定了定义,但它通常涵盖_behaviour_而不是_implementation._ – paxdiablo 2012-02-09 13:38:58

+0

大多数'malloc'实现都是通过更大的块从操作系统(通常是内核,通过系统调用)请求堆内存(通常是几页4K字节)。在Linux上,'malloc'有时可能会使用'mmap'(可能是'sbrk')系统调用来从内核请求“大块”内存。然后'malloc'的实现将会把这个块切成小块,等等......像往常一样,邪恶在细节中。 – 2012-02-09 13:54:23