我的问题非常简单。假设我们有:
char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);
当我们释放指针时会发生什么?这是一种未定义的操作吗?它是否会释放所有的SIZE缓冲区还是只释放剩余的SIZE/2? 提前感谢您为我澄清这个问题。
我的问题非常简单。假设我们有:
char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);
当我们释放指针时会发生什么?这是一种未定义的操作吗?它是否会释放所有的SIZE缓冲区还是只释放剩余的SIZE/2? 提前感谢您为我澄清这个问题。
你的程序可能会崩溃:在C语言中,free()操作其实非常简单,但它只能用于原始分配的地址。
典型的内存分配器的工作方式如下伪代码:
因此,当你调用 free(ptr)
时,分配器会在指针之前的6个字节处检查签名。如果找不到签名,它就会崩溃 :)
free()
的参数不匹配之前使用malloc()
等函数分配的指针,则行为是未定义的。您很可能会在libc
版本中遇到分段错误或失败的断言。malloc()
的结果。这种行为是未定义的,很可能会导致分段错误 - 这还是“好”的情况。在最糟糕的情况下,它将损坏程序的内存并引起各种奇怪的错误和错误输出。
在大多数实现中,这应该会导致某种致命错误。您只能释放已分配缓冲区的开头。
在Windows上(使用Visual Studio编译器),您通常会遇到“非有效堆指针”的错误。在Linux上,如phihag所述,通常会导致分段错误。在两种情况下,这是一个运行时错误,通常会终止程序的执行。
行为是未定义的。我猜你会得到一个段错误...这就是当我在我的系统中尝试时得到的结果。
free()
需要调用者传递一个由内存分配器函数(如malloc()
)返回的地址。其他任何东西都会导致未定义的行为。