malloc分配内存和SIGSEGV
帮助我理解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在那里?
使用调试堆,当您释放内存时(但您没有拨打免费电话),您肯定会收到崩溃或其他通知。
分段错误是针对页面级访问冲突的,而内存页面通常是4k的数量级,所以3个字节的溢出不太可能被检测到,直到更细粒度的检查检测到它或其他部分的代码崩溃,因为您用'垃圾'覆盖了一些内存
malloc
的很多实现将以某种“分辨率”分配以提高效率。
这意味着,即使你问为一个字节,你很可能已经得到了16或32
然而,这是不是你可以依赖,因为它是不确定的行为。
未定义行为意味着什么可以发生,包括尽管有问题的代码工作:-)
先生,(可能是这个愚蠢的问题..但我需要问).. 什么是“许多malloc的实现”? 所有那些使用gcc n glibc的人(从标准网站下载..)实现/定义必须相同...... na ?? n 是否有像malloc,free等函数的标准定义? – saurabh 2012-02-09 13:23:40
@saurabh:是的,gcc(或mor正确glibc)可能有一个特定的实现,但这不是唯一的一个。 MSVC有它自己的,IBM的xlc有另一个等等。 GLibC只是一个实施。 ISO C标准指定了定义,但它通常涵盖_behaviour_而不是_implementation._ – paxdiablo 2012-02-09 13:38:58
大多数'malloc'实现都是通过更大的块从操作系统(通常是内核,通过系统调用)请求堆内存(通常是几页4K字节)。在Linux上,'malloc'有时可能会使用'mmap'(可能是'sbrk')系统调用来从内核请求“大块”内存。然后'malloc'的实现将会把这个块切成小块,等等......像往常一样,邪恶在细节中。 – 2012-02-09 13:54:23
的行为是不确定的,整个事情,所以它可能会或可能不会崩溃。在某些实现中,当你释放(ptr)时,程序会崩溃。 – 2012-02-09 13:02:09
它需要用包装做点什么吗?通常使用32位应用程序进行4字节的默认打包。 – 2012-02-09 13:02:22