C++循环赋值异常:数组l[]值错误,注释r[]赋值后恢复正常
数组越界导致的异常值问题解答
兄弟,你遇到的这个问题本质是数组越界访问引发的未定义行为,咱们一点点拆解来看:
问题根源分析
先看你代码里的这段赋值逻辑:
int r[6]; // r数组的大小是6,合法下标范围是0~5 for(int i=5;i<10;i++) r[i] = a[i];
当循环的i从5走到9的时候,i=6、7、8、9这几个值都超出了r数组的合法下标范围(最大只能到5)。这时候往r[i]里赋值,其实是在写不属于r数组的内存区域。
在C++里,局部数组是按顺序在栈内存中存放的,你的l[6]和r[6]是连续定义的,内存位置挨得非常近。当你越界写r[6]、r[7]...的时候,刚好就覆盖了l数组的内存空间,所以最后打印l的时候才会出现乱码。
为什么注释r的赋值就正常?
当你把r的赋值循环注释掉后,没有了越界写入的操作,l数组的内存没有被破坏,自然就能正常输出你输入的1~5啦。
修复方案
把r数组的赋值下标调整一下,让它对应到合法的范围:
for(int i=5;i<10;i++) r[i-5] = a[i]; // i从5到9时,i-5就是0到4,刚好是r数组的前5个位置
这样既不会越界,也能正确把a[5]~a[9]的值存到r[0]~r[4]里,l数组也不会被破坏了。
内容的提问来源于stack exchange,提问作者AnimEsh Kushwaha
相关产品推荐
相关产品推荐

