为何仅当qInfo访问数组值时for循环未正常递增?
数组越界引发的未定义行为解析
问题核心
两段代码的本质差异在于:第二段在循环中访问了超出数组范围的元素,触发了C++中的「未定义行为」;而第一段只是循环次数错误但未触碰越界内存,所以没出现明显异常。
数组的基本规则
你定义的数组int ages[4] = {23,7,75,1000};只有4个元素,合法的索引范围是0~3(C++数组索引从0开始计数)。
第一段代码的循环表现
循环条件i < 5会让i取0、1、2、3、4这5个值,但代码仅输出i的数值,没有访问ages[i]。虽然循环次数本身不符合数组长度(正确应该是i < 4),但因为没有触碰数组外的内存,程序暂时表现「正常」——这其实是侥幸,循环逻辑本身存在错误。
第二段代码的异常原因
当循环到i=4时,ages[4]属于越界访问:数组之后的内存不属于ages,里面是随机的垃圾值(比如你看到的4713、4714这类数字)。在C++标准中,数组越界属于未定义行为——程序可能输出乱码、直接崩溃,甚至看似正常运行,完全取决于当前的内存布局。
你看到的异常输出,就是访问数组外未知内存区域的直接结果。另外,第一段中qInfo() << ages输出的是数组的内存地址(0x7ff7d01f3010),而第二段中该输出变成乱码,也是越界访问破坏内存布局的表现之一。
修复方案
把循环条件改成i < 4,或者用sizeof(ages)/sizeof(ages[0])自动计算数组长度,避免硬编码数字:
for (int i = 0; i < sizeof(ages)/sizeof(ages[0]); i++){ qInfo() << i; qInfo() << ages[i]; }
内容的提问来源于stack exchange,提问作者sal.mel
相关产品推荐
相关产品推荐

