c调试问题,免费方法

时间:2011-03-09 15:12:27

标签: c debugging free

我在C程序中遇到了问题:

char *str = (char *) malloc(20);
strcpy_s(str, 10, "abcdefghij");

//here I change one byte before str and one byte after
*((int*)str-1) = 10;
*((int*)(str+20)) = 10;

//and it stops on the..

free(str);
调试期间

行 怎么了?

重写未分配内存的部分是任务的一部分。我知道通常它不正确,但在这种情况下它是任务的一部分。

4 个答案:

答案 0 :(得分:5)

为什么您认为自己有权更改位于str-1的任何内容?你没有:)

看来你还有另一个问题,因为第一个的生动性超出了我的注意力。您可以访问的地址从str + 0str + 19不等。 str + 20超出你的境界:)

这两件事都会产生所谓的undefined behavior。这意味着您不会对 任何 行为感到惊讶!包括失败的free,调试器崩溃或其他任何

答案 1 :(得分:4)

您不能写入str+20,因为您只请求了20个字节,因此str+19是您拥有的最后一个字节。 str-1也是如此。

答案 2 :(得分:4)

在您分配的内容之外写入内存会产生未定义的行为。

在这种特殊情况下,我们可以猜测堆管理器可能有一些关于每个存储块的簿记信息,这些信息存储在它交给你的内存之前。当您在分配的块之前写入字节时,您将覆盖其中的某些部分,因此它无法再正确释放块。

答案 3 :(得分:2)

*((int*)str-1)通常用于存储已分配空间的长度,以便free知道要释放多少字节...