关于 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

相关文章

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、