繁体   English   中英

指针算术后释放指针

[英]Freeing pointer after pointer arithmetic

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

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

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

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

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

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

所以当你调用free(ptr) ,分配器会在你的指针前输入6个字节来检查签名。 如果它没有找到签名,它会崩溃:)

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

Offtopic:你最好没有在C中投射malloc()的结果。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM