总结了一些内存问题

内存问题
了解内存问题之前 首先 需要知道C语言中的内存模块分区。
C语言中的内存模块分区:
C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下:

1、栈区:存放函数的参数值、局部变量等,由编译器自动分配和释放,通常在函数执行完后就释放了,其操作方式类似于数据结构中的栈。栈内存分配运算内置于CPU的指令集,效率很高,但是分配的内存量有限,比如iOS中栈区的大小是2M。(栈是先进后出,队列是先进先出)

2、堆区:就是通过new、malloc、realloc分配的内存块,编译器不会负责它们的释放工作,需要用程序区释放。即 一般需要程序员手动申请和释放。分配方式类似于数据结构中的链表。“内存泄漏”通常说的就是堆区。

3、静态区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后,由系统释放。

4、常量区:常量存储在这里,不允许修改。(其实常量,全局变量和静态变量 都可统一称为全局区)

5、代码区:顾名思义,存放代码,只读区域,即在程序运行中无法做任何修改的存储区域。(其实可读可写的区域也都称为数据区)

内存问题 C语言中的内存模块分区:

内存越界


发生场景 :一般在数据区,一般有两种情形:读越界和写越界。

1.读越界:
表示 读取到了不属于有效范围(或合法范围)的区域的数据。
例如:

以上两种,下标范围是(0-4),一个是读取到了初始下标之前为-1 的不属于它的区域,一个是读取到了最终下标的 下标为5的区域, 理论上说 ,最终都会造成程序的崩溃。但是实际上在VC6.0中 程序继续没有报错,但是返回值 是一个根据你数组上下文的数据的一个随机值。完全不是你应该读取到的正常值

2.写入越界

数据写入不属于有效范围(或合法范围)的区域,写越界一般也称为“缓存区溢出”,所写入数据对于目标地址而言是随机的。

以上则是 写入超过有效范围的数据, 可以看出 读取的时候 也超过了有效范围,导致超过有效范围(下标0-4)的数据 输入与输出的时候是有差异的。 一般来说,超界的时候会造成程序崩溃 但是在vc6.0中没有报错 程序正常执行,但是最终结果是随机值。

可以看出输入超界后 ,有效范围内的数据读取的时候 数据是正常的。所以可知,其实写入越界是一种隐性的故障,虽然有时表面看似没有问题,但会影响程序的稳定性和造成后续的故障。
一般在sprintf ,strcpy,strcat,gets时 都应该注意内存越界问题,尽量在定义内存时,进行合理的定义可以有效避免此类问题

多重定义:

在定义数据时 ,已经定义过后,又进行了二次乃

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值