Visual Studio调试时,出现“触发一个断点”内存释放出现异常

数组和对应指针的NULL初始化

数组使用之前要先对其初始化

char Outi[4] = { NULL };
char Outj[4] = { NULL };

对应指针进行动态初始化

 1 #define SIZE 4
 2
 3 char *Outi = (char *)malloc(SIZE * sizeof(char));
 4 memset(Outi, 0, SIZE * sizeof(char));
 5
 6 for (int i = 0; i <4; i++)
 7     strcat(Outi, "1");
 8
 9
10 free(Outi);
11 Outi = NULL;

分配内存后,需要对内存进行释放,程序对内存进行释放后,并不会将其置为NULL,必须手动将指针置为NULL,防止访问野指针或再次释放出错。

释放内存触发断点

上面对应指针进行初始化的代码中,运行起来会在释放内存处触发断点,因为Outi开辟了4个char的内存,但是strcat函数执行后会在结尾添加NUL字节,即'\0'结尾标识符,则会超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,因此释放时会报错,这种错误称为缓冲区溢出

解决方法:指针开辟动态内存时,需要多开辟一个数据类型的空间。

缓冲区溢出:缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区 又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

栈溢出:栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。

栈溢出是缓冲区溢出的一种。

转载于:https://www.cnblogs.com/qinguoyi/p/10149909.html

释放内存触发断点及数组、指针的NULL初始化相关推荐

  1. java数组释放内存空间,Java中数组的内存分析

    正文 引言: 墨白在文末给大家准备了程序员的适用壁纸,需要的小伙伴自取,今天的内容是给大家聊聊Java中数组的内存分析和原理,很多朋友可能已经忘记了,毕竟这是非常基础的点了,这次算是给大家复习了吧! ...

  2. c++二维数组、二维指针、数组指针、指针数组

    一.二维数组 1.定义: //方法一 int arr1[2][3]; //方法二 int arr2[2][3] = { {1,2,3},{4,5,6} }; //方法三 int arr3[2][3] ...

  3. (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19754585 昨天写了单向链表的代码,今天上午把单向循环链表的程序给敲完了.链表的相关操作一样的,包含 ...

  4. (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19760681 上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也 ...

  5. C++定义指针数组,数组指针,指针数据

    https://www.cnblogs.com/warmfrog/p/3695173.html C语言或C++中,数组元素全为指针的数组称为指针数组 一维指针数组的定义为:类型名*数组标识符[数组长度 ...

  6. 深入浅出C语言:(三)C 语言数组指针(指向数组的指针)

    目录 一.C 语言数组指针(指向数组的指针) 二.C 语言字符串指针(指向字符串的指针) 三.C 语言指针数组(数组每个元素都是指针) 四.二维数组指针(指向二维数组的指针) 五.指针数组和二维数组指 ...

  7. c语言中free函数释放内存后,会怎么样?

    比如有一个 int* p 的指针,申请内存: p = (int*)malloc(sizeof(int)); 你就可以对 p 做这样的操作:*p = 54; 使用 free(p);那么就是切断了 p 对 ...

  8. Golang学习——数组指针和指针数组的区别

    Golang中数组指针和指针数组区别 一.数组指针 1.语法 2.实例 3.通过指针访问数组 二.指针数组 1.语法 2.实例 区别二者,字面上只看 后两个字即可: 数组指针 :它是一个指针,但是数据 ...

  9. 关于指针数组与数组指针详解(知识点全面)

    1.目录 1.指针数组 2.数组指针 2.它们的区别 1.指针数组 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.其一般形式为: 数据类型    *数组名[常量表达式][常量表达式 ...

最新文章

  1. 同步、异步、阻塞、非阻塞、BIO、NIO、AIO
  2. Eclipse基本使用
  3. AI+5G:2019.03.31第11届中国(深圳)IT领袖峰会【IT新未来: 5G与人工智能】内容概要
  4. 不迈出第一步,不去尝试,你永远不知道能否成功
  5. 最新进展!单细胞数据显示ACE2在鼻腔、肾脏、睾丸均有分布!
  6. 关于大型网站技术演进的思考(六)--存储的瓶颈(6)
  7. git push 失败出现error: src refspec master does not match any.解决方案
  8. ubuntu14.04系统下mips交叉编译环境搭建
  9. 小米平板2刷哪个系统更流畅_教程:小米平板2轻松刷Win10
  10. c语言入门视频教程(C语言入门视频教程 百度网盘)
  11. JS原型与原型链总结
  12. 高级程序员和普通程序员有哪些区别?
  13. 搭建百万级别邮件发送平台
  14. C语言实现AES ecb加解密
  15. 学生平价蓝牙耳机推荐,适合学生党的好音质平价蓝牙耳机
  16. 游戏程序员的核心竞争力是什么?
  17. HNOI2014 世界树 基于虚树的树形动态规划
  18. 数据结构与算法笔记:计算思维之人鬼渡河问题
  19. android菜鸡提升之路---实现一个积木拼图游戏
  20. 学习记录——微信小程序查询的两种方法

热门文章

  1. MongoDB 安全 checklist 及最优配置模板
  2. vmware horizon view 添加vcenter server
  3. Android NDK 简单介绍、工具安装、环境配置
  4. jquery 中attr和prop的区别
  5. MySql错误处理(三)- 错误处理的例子
  6. GNS3做交换实验使用感受
  7. 论坛答疑SQL(二)
  8. json 和 pickle
  9. Linux curl API 使用 C语言
  10. So many interfaces!