使用如下语句分配堆中内存空间:

        char * ptr = (char *)malloc(SIZE+1);

在之后的程序中ptr++;类似的移动ptr所指向的位置的操作,最后free(ptr);为什么失败甚至导致崩溃,为什么不是释放了部分内存(ptr当前位置到原分配内存空间末尾处)?

 

原因是分配内存时,每个分配的内存块都有一个头部来表示基本信息如内存大小等,free的时候是依据这个头部中的信息来决定如何释放。若改变了ptr的值,则之后free()将无法定位到该内存头部,也就导致释放操作的失败。