以下是我认为可能导致此错误的简化程序。
char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
p[i] = '1';
}
char *s = (char*)malloc(strlen(p));
原始项目相当复杂,所以我简化了它。我使用malloc分配了8192个字节。然后我的程序将超过8192个字符写入数组。然后我将使用malloc分配内存。
这个迷你程序并没有崩溃。但在最初的大项目中,它崩溃了这个错误:
malloc():内存损坏:0x0000000007d20bd0 ***
可能导致这种差异的原因是什么?
答案 0 :(得分:6)
undefined behavior ,因为您已经分配了8192
个字节的内存,但是您尝试编写9200
个字节。哪个是出界的。
答案 1 :(得分:3)
可能导致这种差异的原因是什么?
基本上,内存分配器一次分配内存的页以供程序使用,它会在其中为您指定一个指针(确保以下空间可以免费使用)。由于这些页面通常大于8KiB,因此您的迷你程序没有问题。但是如果一个更大的程序分配更大量的内存并在你分配的空间结束后进一步写入,那么你最终会尝试写入未分配的内存(或另一个程序使用的内存!),从而破坏存储器中。
答案 2 :(得分:2)
写入尚未分配的内存是未定义的行为。那是因为malloc()
返回了你可以写入的一段内存,所以当你写过该区域的末尾时,你会覆盖不属于你的东西。
这可能是malloc本身使用的结构,或完全不同的东西。
答案 3 :(得分:1)
这是运气问题。您的操作系统可能会保留超过您请求的8kB的内存。您之前和之后保留的内容可能会对行为产生影响。
没有说你的程序会因缓冲区溢出而崩溃。实际上,行为是未定义的或实现定义的。