信盈达教育老师直接接听

400-029-09** 400-029-0997 转 23842
查看完整号码
扫码拨号
微信扫码拨号

C语言 | 详解常见问题之数组越界与溢出

作者:信盈达分享汇 来源:信盈达分享汇 2023/12/27 15:01:49

直 播 地 址 址 JUST FOR YOU信盈达——知识分...

直 播 地 址 址 JUST FOR YOU
信盈达——知识分享进行时!!! 周一到周五,15:00 工程师准时在直播间等你 直播间指路: 视频号、B站、知 乎 搜索“信盈达”; 抖音 :搜索“信盈达”,“信盈达学嵌入式吧”两个号都有直播哦 多平台直播同步进行,机不可失!!! 直播间活力十足,工程师在线给你答题解惑~ 数组越界 C语言数组是静态的,不能自动扩容,当下标小于零或大于等于数组长度时,就发生了越界(Out Of Bounds),访问到数组以外的内存。如果下标小于零,就会发生下限越界(Off Normal Lower);如果下标大于等于数组长度,就会发生上限越界(Off Normal Upper)。 C语言为了提高效率,保证操作的灵活性,并不会对越界行为进行检查,即使越界了,也能够正常编译,只有在运行期间才可能会发生问题。请看下面的代码: #include <stdio.h> int main() return 0; 运行结果: 越界访问的数组元素的值都是不确定的,没有实际的含义,因为数组之外的内存我们并不知道是什么,可能是其它变量的值,可能是函数参数,可能是一个地址,这些都是不可控的。 由于C语言的”放任“,我们访问数组时必须非常小心,要确保不会发生越界。每个C语言程序员的生涯中都遇到过越界错误,因为越界错误有时候不容易发现,也不容易复现。 当发生数组越界时,如果我们对该内存有使用权限,那么程序将正常运行,但会出现不可控的结果(如上例所示);如果我们对该内存没有使用权限,或者该内存压根就没有被分配,那么程序将会崩溃。请看下面的例子: #include <stdio.h> int main() int a[3]; return 0; 在 VS2010 下运行,会出现运行时错误:
在 C-Free 5.0 下运行,会弹出程序停止工作的对话框: 数组溢出 当赋予数组的元素个数超过数组长度时,就会发生溢出(Overflow)。如下所示: 数组长度为3,初始化时却赋予5个元素,超出了数组容量,所以只能保存前3个元素,后面的元素被丢弃。 GCC、LLVM/Clang、低版本的 VS(例如 VS2010)发现数组溢出只会给出警告,并不会报错。但是高版本的 VS(例如 VS2015、VS2017)发现数组溢出时会报错,禁止编译通过,微软终于聪明了一次。 一般情况下数组溢出不会有什么问题,顶多是丢失多余的元素。但是当以字符串的形式输出字符数组时,就会产生不可控的情况,请看下面的代码: #include <stdio.h> int main() puts(str); return 0; 在 DEV下的运行结果:
总结: 能够理解数组越界和数组溢出的原因,并且在编程中注意避免。

声明:文章来源于网络,原文版权归原作者所有,如有侵权,请联系删除 。 - END- 点击下方视频,关注我们视频号,精彩视频享不停! 信盈达 10大热门IT线上精品 课 火热学习中,点击文章底部 阅读原文 立即获取 免费学习 名额。 阅读福利 热门IT课程视频&资料领取

预约嵌入式、物联网、Java大数据、Python人工智能、硬件PCB线上课程, 点击文末“ 阅读原文 ”进行免费学习!

“广州信盈达教育”是深圳信盈达科技有限公司广州分公司在教育宝平台开设的店铺,若该店铺内信息涉嫌虚假或违法,请点击这里向教育宝反馈,我们将及时进行处理。

机构评分

环境:4.0师资:4.0服务:4.0效果:4.0

公示信息

店铺名称:广州信盈达教育

单位名称:深圳信盈达科技有限公司广州分公司

账号名称:gzxyd(180******33)

所属城市:广东广州

入驻时长:6年

在线客服:在线聊

微信咨询

返回顶部