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));
由于 width
是 size_t
,sizeof(size_t)
将是 4 或 8,具体取决于您编译的是 32 位还是 64 位代码。
因此,这将分配 4 或 8 个字节。 memcpy
ed 远远少于 30 个字节。
这就是你的堆损坏,就在这里。
我正在使用 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));
由于 width
是 size_t
,sizeof(size_t)
将是 4 或 8,具体取决于您编译的是 32 位还是 64 位代码。
因此,这将分配 4 或 8 个字节。 memcpy
ed 远远少于 30 个字节。
这就是你的堆损坏,就在这里。