指针算术后释放指针

Lef*_*ris 5 c pointers pointer-arithmetic

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

char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*i13 10

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

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

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

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


Mic*_*kis 8

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

Offtopic:你最好没有把结果malloc()用C表示.