关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析

2024-04-01 23:12

本文主要是介绍关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况: 

二、问题原因(重要):

三、举例

1.错误代码如下:

2.错误原因及分析(重要):

3.解决方法

​编辑 4.正确代码:


一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况: 

        先说明出错问题及原因,如有急需解决问题的码友可以参考一下,如果想进一步了解我怎么遇到该问题,如何解决的,可以继续往下阅读。


二、问题原因(重要):

        该问题发生于操作堆内存的时候。

        产生该问题的原因是实际使用的内存大小超出了实际申请的内存大小,该问题在输出的时候或者代码运行的时候不会报错,但一旦free释放内存,就会出现上面的Debug Error。

         所以只需要注意实际使用的内存大小(A)与实际申请内存大小(B)之间永远保持A<=B就能将该问题解决了。

        该问题有点静态数组溢出的意思,但并不一样。


三、举例

        拿我上一篇博客Leetcode509——斐波那契数(C语言)-CSDN博客中的方法三举例,用数组实现斐波那契数的原理及求值。

1.错误代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <malloc.h>
void fib(int n)
{int i;int* arr = (int*)malloc(n * sizeof(int));//n+1是为了避免实际使用内存比申请的内存大,而为释放内存埋下隐患arr[0] = 0;arr[1] = 1;if (n >= 2) {for (i = 2; i <= n; i++)   {arr[i] = arr[i - 1] + arr[i - 2];}}else if(n==1){i = 1;}else{i = 0;}printf("%d", arr[n]);free(arr);//释放分配的内存}
int main()
{int n;scanf("%d", &n);fib(n);return 0;
}

2.错误原因及分析(重要):

        之所以出错是因为我实际申请了n 取决于我在主函数main中输入时的数值,而最终实际用到了n+1个内存空间。

        如果没有看懂,我在举一个简单的例子:

        假如你申请了n=5(int类型),20个字节的堆内存空间;

	int* arr = (int*)malloc(n * sizeof(int));

        但是你在实际使用的时候使用了24个字节的堆内存空间;

        在arr指向的20个字节的堆内存空间中,写入一个超过字节的内容时,vs 2022的编译器并不会报错,但在最后为内存释放时,会引发HEAP CORRUPTION DETECTED:after Normal block的错误。

3.解决方法

 4.正确代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <malloc.h>
void fib(int n)
{int i;int* arr = (int*)malloc((n+1) * sizeof(int));//n+1是为了避免实际使用内存比申请的内存大,而为释放内存埋下隐患arr[0] = 0;arr[1] = 1;if (n >= 2) {for (i = 2; i <= n; i++)   {arr[i] = arr[i - 1] + arr[i - 2];}}else if(n==1){i = 1;}else{i = 0;}printf("%d", arr[n]);free(arr);//释放分配的内存}
int main()
{int n;scanf("%d", &n);fib(n);return 0;
}

 

这篇关于关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868382

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT