C问题免费()

时间:2010-12-08 11:59:25

标签: c malloc free

#include <stdio.h>
int main ()

{

   int *p = (int *)malloc((100*sizeof(int)));

   p++;

   free(p);

/* do something */

return 0;

}

问题:

  1. 从位置p + 1开始的内存是否空闲(如果malloc返回0x1000,释放的内存将来自0x1004,假设4字节整数)?

  2. 除了0x1000的4个字节(如果malloc返回0x1000)不可用(除非你做p--并使用地址)

5 个答案:

答案 0 :(得分:12)

这是未定义的行为 - 您必须将free()完全相同的指针传递给malloc()。使用您的代码可能会发生任何事情 - 可能堆已损坏。

这样想。 free()只有一个参数,因此它必须推断出哪一个标记可以完全脱离该参数。没有办法“释放更少的记忆” - 要么全部释放(要求扣除将是非常耗时的btw),要么发生不好的事情 - 后者更有可能。你不应该假设任何事情,只是不要那样做。

答案 1 :(得分:1)

free()调用将失败,因为p不再是使用malloc()分配的块的地址。

答案 2 :(得分:0)

这段代码不起作用 - 你只能释放由malloc或类似函数分配的指针,你不能释放部分已分配的内存范围。

答案 3 :(得分:0)

嘿,我在gcc上尝试了这个代码,它停止了:

*** glibc detected *** ./a.out: free(): invalid pointer: 0x0829600c ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x7be591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x7bfde8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x7c2ecd]

因此,根据您的第一个答案,您无法释放下一个内存位置。 而对于第二个问题: 除非你做了p--否则这四个字节将无法使用,除非你改变下一个内存位置的内容并且你可以通过执行p -

来使用分配的内存位置,否则这个代码将正常工作

答案 4 :(得分:0)

在标准中这种行为是“未定义的”,但实际上,什么都不会被释放。 原因是malloc保留了已分配的块的列表,每个块都由其起始地址标识。 p + 1不在该列表中,因此free将找到一个可以释放的块,并且什么都不做。