memcpy 之后 free() 结构指针时堆损坏

heap corruption when free() struct pointer after memcpy

我正在使用 Visual Studio 2019 用 C 编写通用排序函数。

我用原型做了一个通用的插入排序函数:

void insertion_sort(void* const arr, size_t left, size_t right, size_t width, _Cmpfun cmp)

其中 _Cmpfunc 的类型定义为

typedef int (*_Cmpfun) (const void*, const void*);

为了测试这个功能是否正常工作,我为测试制作了一个结构 ELEMENT。

typedef struct {
    unsigned int score;
    float data[3];
    char comments[16];
} ELEMENT;

为了保存一个数据,我是这样动态分配内存的

    char* top_ptr = (char*)malloc(sizeof(width));

每当我尝试 free() top_ptr 之后

memcpy(top_ptr, some_valid_pointer, width)

其中 some_valid_pointer 不是 NULL 指针,宽度是 insertion_sort

的参数

、Visual Studio 弹出堆损坏错误。

这仅在调用 memcpy 函数后发生。

如果我这样做 :

char* top_ptr = (char*)malloc(sizeof(width));
free(top_ptr);

它工作正常。

我在网上搜索什么是Heap corruption error,发现是memcpy函数覆盖结构变量的无效内存时发生的。

我在 main 中使用 width = sizeof(ELEMENT) 调用函数 insertion_sort,因此考虑了结构变量的填充。

我不知道是什么问题。我的代码有什么问题?

您分配的内存大小为 sizeof(width):

char* top_ptr = (char*)malloc(sizeof(width));

但正在复制大小为 width 的内存:

memcpy(top_ptr, some_valid_pointer, width)

很可能 sizeof(width) < width,因此堆损坏。

width = sizeof(ELEMENT)

sizeof(ELEMENT),使用粗略计算,应该在大约 30 个字节附近。那就是你的 ELEMENT 有多大。

char* top_ptr = (char*)malloc(sizeof(width));

由于 widthsize_tsizeof(size_t) 将是 4 或 8,具体取决于您编译的是 32 位还是 64 位代码。

因此,这将分配 4 或 8 个字节。 memcpyed 远远少于 30 个字节。

这就是你的堆损坏,就在这里。