C:MSVC2008 Malloc和崩溃程序

C:MSVC2008 Malloc和崩溃程序,c,malloc,C,Malloc,这个问题可能是补救性的,但我和malloc有很多麻烦。为什么我的程序在释放内存时崩溃 #include <stdlib.h> #include <malloc.h> int main(int argc, char *argv[]) { int *arr[10]; void *mem = malloc( 10 * sizeof(int) ); int i; for(i=0;i<=9;i++) { arr[i] = (in

这个问题可能是补救性的,但我和malloc有很多麻烦。为什么我的程序在释放内存时崩溃

#include <stdlib.h>
#include <malloc.h>
int main(int argc, char *argv[]) {
    int *arr[10];
    void *mem = malloc( 10 * sizeof(int) );
    int i;
    for(i=0;i<=9;i++) {
        arr[i] = (int*) mem + i*sizeof(int);
        *arr[i]= 9-i;
    }
    //void** ar = (void**) arr;
    //medianSort(ar, cmp, 0, 9);
    free(mem); //crashes here
    return 0;
}

您正在超出分配的内存进行写入。注意
(int*)mem
int
指针,因此添加1实际上会将内存位置移动
sizeof(int)
字节。换句话说,您不应该自己在循环中执行
sizeof(int)
,因为指针算法说编译器会为您这样做。

如果您从一开始就声明
int*mem
,并自然地使用它,例如
arr[i]=mem+i
#ifdef _WIN64
    return HeapAlloc(_crtheap, 0, size ? size : 1);
#else  /* _WIN64 */
    if (__active_heap == __SYSTEM_HEAP) {
        return HeapAlloc(_crtheap, 0, size ? size : 1); //crashes here
    } else
    if ( __active_heap == __V6_HEAP ) {
        if (pvReturn = V6_HeapAlloc(size)) {
            return pvReturn;
        }
    }