指针算术后释放指针

时间:2011-05-16 06:05:56

标签: c pointers pointer-arithmetic

我的问题非常简单。说我们有:

char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);

当我们释放指针时会发生什么?是不确定的操作? 它是否释放所有SIZE缓冲区或仅剩余的SIZE / 2? 在此先感谢我为此消除歧义。

5 个答案:

答案 0 :(得分:10)

您的程序可能会崩溃:free()操作在C中实际上非常简单,但仅适用于原始分配的地址。

典型的内存分配器就像这个伪代码一样:

  • 要求分配64个字节
  • allocator分配70个字节(多6个字节)
  • 前2个字节设置为“签名”,分配器识别的模式用于标识由他分配的内存
  • 接下来的4个字节表示分配的大小
  • 返回指向第7个字节开头的指针

因此,当您调用free(ptr)时,分配器会在指针前输入6个字节来检查签名。如果找不到签名,则会崩溃:)

答案 1 :(得分:8)

如果free()的参数与先前通过malloc()和朋友分配的指针不匹配,则行为未定义。您很可能在libc版本中遇到分段错误或断言失败。

Offtopic:最好不要将malloc()的结果投射到C中。

答案 2 :(得分:2)

行为未定义,最有可能导致分段错误 - 这就是好的案例。在最坏的情况下,它会破坏程序的内存并引发各种奇怪的错误和错误的输出。

答案 3 :(得分:2)

在大多数实现中,这应该会导致某种致命错误。你只能释放分配缓冲区的开头。

他们在Windows上遇到的典型错误(使用visual studio编译器)会像“不是有效的堆指针”。在linux上,如上面phihag所说,它通常会导致分段错误。在这两种情况下,都是运行时错误,通常会终止程序的执行。

答案 4 :(得分:2)

行为未定义。我想你会得到一个段错误......这就是我在系统中尝试时得到的结果。

free()要求调用者传递由malloc()等内存分配器函数返回的地址。其他任何事都会导致未定义的行为。