malloc():内存损坏

Yua*_*Wen 3 c linux memory-management

这是我认为可能导致此错误的简化程序.

char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
  p[i] = '1';
}
char *s = (char*)malloc(strlen(p)); 
Run Code Online (Sandbox Code Playgroud)

原始项目相当复杂,所以我简化了它.我使用malloc分配了8192个字节.然后我的程序将超过8192个字符写入数组.然后我将使用malloc分配内存.

这个迷你程序没有崩溃.但在最初的大项目中,它崩溃了这个错误:

malloc():内存损坏:0x0000000007d20bd0***

什么可能导致这种差异?

msc*_*msc 8

它是未定义的行为,因为您已分配8192字节内存,但您正在尝试写入9200字节.哪个是出界的.

  • 没有不同类型的未定义行为.未定义的行为未定义. (12认同)
  • @YuanWen未定义的行为意味着任何事情都可能发生.您的程序可能会崩溃,它可能会工作,它可能会引入细微的数据损坏,它可能会格式化您的硬盘.如果附加了合适的硬件,它可能会创建天网,并开始消灭人类. (4认同)
  • @rootTraveller:没有必要在*all*代码崩溃...再次:未定义的行为是未定义的.我已经看到这样的代码在生产中运行了多年...... :-( (3认同)

小智 6

是什么导致这种差异?

基本上,内存分配器会立即分配内存页面供程序使用,并在其中分配一个指针(确保可以自由使用以下空间)。由于这些页面通常大于8KiB,因此您的小程序没有问题。但是,如果更大的程序分配了更多的内存,并且在分配的空间的末尾越来越远地写入数据,那么您最终将尝试写入未分配的内存(或另一个程序使用的内存!),从而破坏了内存。

  • 在具有 MMU 的 CPU 之上的任何现代操作系统中,写入用户空间中另一个进程的内存并不是你真正要做的事情,除非明确共享内存,但通常如果是这种情况,你*想要*写到“另一个程序使用的内存”。 (3认同)