【发布时间】:2021-12-14 23:08:03
【问题描述】:
我正在使用 Visual Studio 2019 用 C 语言编写一个通用排序函数。
我用原型做了一个通用的插入排序函数:
void insertion_sort(void* const arr, size_t left, size_t right, size_t width, _Cmpfun cmp)
_Cmpfunc 是 typedef as
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 指针,width 是 insert_sort 的参数
,Visual Studio 弹出堆损坏错误。
这仅在调用memcpy 函数后发生。
如果我这样做:
char* top_ptr = (char*)malloc(sizeof(width));
free(top_ptr);
效果很好。
我在网上搜索了什么是堆损坏错误,发现当memcpy函数覆盖结构变量的无效内存时发生。
我在main 中使用width = sizeof(ELEMENT) 调用函数insertion_sort,因此考虑了结构变量的填充。
我不知道是什么问题。我的代码有什么问题?
【问题讨论】:
-
我们不能说没有看到实际的代码。请提供一个minimal reproducible example 来说明问题。另请注意,C 和 C++ 是不同的语言,请选择一种。
-
size_t width是arr的单个元素的字节数。例如arr[0]的下一个元素的指针将是arr + width。底层结构怎么会大于宽度? (函数调用width = sizeof(ELEMENT))
标签: c++ c memcpy heap-corruption