广州信盈达教育

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

作者:信盈达分享汇 来源:信盈达分享汇 2023年12月27日

直 播 地 址 址 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线上课程, 点击文末“ 阅读原文 ”进行免费学习!

相关资讯
HarmonyOS系列讲座:认识不一样的鸿蒙 全国“双师型”骨干教师高级研修-HarmonyOS鸿蒙系统寒假师资培训邀请函 第二批就业育人项目申报指南 大家印象中的程序员是怎样的呢?薪资高?加班多?很忙?? 【假期驿站】信盈达新开4场IT直播课,都是热门方向的!
相关课程