我的问题非常简单。说我们有:
char* ptr = (char*) malloc(sizeof(char)*SIZE);
ptr+= SIZE/2;
free(ptr);
当我们释放指针时会发生什么?是不确定的操作? 它是否释放所有SIZE缓冲区或仅剩余的SIZE / 2? 在此先感谢我为此消除歧义。
答案 0 :(得分:10)
您的程序可能会崩溃:free()操作在C中实际上非常简单,但仅适用于原始分配的地址。
典型的内存分配器就像这个伪代码一样:
因此,当您调用free(ptr)
时,分配器会在指针前输入6个字节来检查签名。如果找不到签名,则会崩溃:)
答案 1 :(得分:8)
如果free()
的参数与先前通过malloc()
和朋友分配的指针不匹配,则行为未定义。您很可能在libc
版本中遇到分段错误或断言失败。
Offtopic:最好不要将malloc()
的结果投射到C中。
答案 2 :(得分:2)
行为未定义,最有可能导致分段错误 - 这就是好的案例。在最坏的情况下,它会破坏程序的内存并引发各种奇怪的错误和错误的输出。
答案 3 :(得分:2)
在大多数实现中,这应该会导致某种致命错误。你只能释放分配缓冲区的开头。
他们在Windows上遇到的典型错误(使用visual studio编译器)会像“不是有效的堆指针”。在linux上,如上面phihag所说,它通常会导致分段错误。在这两种情况下,都是运行时错误,通常会终止程序的执行。
答案 4 :(得分:2)
行为未定义。我想你会得到一个段错误......这就是我在系统中尝试时得到的结果。
free()
要求调用者传递由malloc()
等内存分配器函数返回的地址。其他任何事都会导致未定义的行为。