【发布时间】:2017-04-24 10:39:57
【问题描述】:
这是我认为可能导致此错误的简化程序。
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 ***
什么可能导致这种差异?
【问题讨论】:
-
您已分配 8192 字节,但尝试写入 9200 字节。这有什么意义?你试着不这样做怎么样,内存不会被破坏? :)
-
除了尝试写入您尚未分配的内存之外,在您的 for 循环之后,
p现在指向您写入的最后一个1之后的字节。这意味着strlen(p)不会返回任何有意义的内容。 -
“什么可能导致这种差异?”未定义的行为是未定义的。
-
strlen()将在 任何 情况下失败(导致未定义的行为),因为没有写入0-terminator。 -
在C中也有no需要转换
malloc()&朋友的结果。
标签: c linux memory-management