指针算术之后释放指针

| 我的问题很简单。说我们有:
char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);
当我们释放指针时会发生什么?它是未定义的操作吗? 它会释放所有SIZE缓冲区还是仅释放剩余的SIZE / 2? 在此先感谢您为我消除歧义。     
已邀请:
您的程序可能会崩溃:free()操作实际上在C语言中非常简单,但仅适用于原始分配的地址。 典型的内存分配器的工作方式类似于以下伪代码: 要求分配64个字节 分配器分配70个字节(多6个字节) 前2个字节设置为\“ signature \”,这是分配器识别的模式,用于标识由他分配的内存 接下来的4个字节表示分配的大小 返回指向第7个字节开头的指针 因此,当您调用
free(ptr)
时,分配器在指针检查指针之前的6个字节处移动。如果找不到签名,则会崩溃:)     
如果
free()
的自变量与先前通过
malloc()
和friends分配的指针不匹配,则行为未定义。在您的ѭ4version版本中,您很可能会遇到分段错误或断言失败。 题外话:最好不要在C中强制转换
malloc()
的结果。     
该行为是不确定的,很可能会导致分段错误-这是一个很好的例子。在最坏的情况下,它将破坏程序的内存并引发各种奇怪的错误和错误的输出。     
在大多数实现中,这应该导致某种致命错误。您只能释放分配的缓冲区的开头。 您在Windows(使用Visual Studio编译器)上遇到的典型错误将是“不是有效的堆指针”。如phihag所述,在Linux上,通常会导致分段错误。在这两种情况下,都是运行时错误,通常会终止程序的执行。     
该行为是不确定的。我想您会遇到段错误...这就是我在系统中尝试时得到的。 “ 2”要求调用者传递由“ 3”之类的内存分配器函数返回的地址。其他任何情况都会导致不确定的行为。     

要回复问题请先登录注册