我在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);
调试期间行 怎么了?
重写未分配内存的部分是任务的一部分。我知道通常它不正确,但在这种情况下它是任务的一部分。
答案 0 :(得分:5)
为什么您认为自己有权更改位于str-1
的任何内容?你没有:)
看来你还有另一个问题,因为第一个的生动性超出了我的注意力。您可以访问的地址从str + 0
到str + 19
不等。 str + 20
超出你的境界:)
这两件事都会产生所谓的undefined behavior。这意味着您不会对 任何 行为感到惊讶!包括失败的free
,调试器崩溃或其他任何
答案 1 :(得分:4)
您不能写入str+20
,因为您只请求了20个字节,因此str+19
是您拥有的最后一个字节。 str-1
也是如此。
答案 2 :(得分:4)
在您分配的内容之外写入内存会产生未定义的行为。
在这种特殊情况下,我们可以猜测堆管理器可能有一些关于每个存储块的簿记信息,这些信息存储在它交给你的内存之前。当您在分配的块之前写入字节时,您将覆盖其中的某些部分,因此它无法再正确释放块。
答案 3 :(得分:2)
*((int*)str-1)
通常用于存储已分配空间的长度,以便free
知道要释放多少字节...