Visual Studio 2019下C语言通用插入排序中memcpy后free结构体指针触发Heap corruption问题排查
问题定位与解决
哦,这是个典型的新手容易踩的内存分配小坑!我一眼就发现了问题所在:
你动态分配内存的代码写错了:
char* top_ptr = (char*)malloc(sizeof(width));
这里的sizeof(width)是取**width这个变量的类型(size_t)的大小**,而不是width变量存储的实际值。比如在64位系统中size_t是8字节,32位是4字节——但你需要分配的是和待复制元素大小一致的空间(也就是width参数传入的sizeof(ELEMENT),远大于4/8字节)。
当你执行memcpy(top_ptr, some_valid_pointer, width)时,相当于把远大于分配容量的数据强行写入小内存块,直接破坏了堆的内部元数据,这就是Visual Studio弹出Heap corruption错误的原因。而直接malloc后free没问题,是因为此时堆结构还没被非法写入破坏。
修正方案
把malloc的参数改成width即可:
char* top_ptr = (char*)malloc(width);
另外,建议养成检查malloc返回值的习惯,避免后续操作空指针:
char* top_ptr = (char*)malloc(width); if (top_ptr == NULL) { // 处理内存分配失败的情况,比如返回错误码或终止程序 perror("malloc failed"); exit(EXIT_FAILURE); }
内容的提问来源于stack exchange,提问作者강찬희
相关产品推荐
相关产品推荐

