C++数组打印输出-858993460异常问题排查
问题根因说明
你遇到的问题由两个明确的编码错误导致,和栈/堆随机值无关:
- 你打印的从来不是刚写入的数组元素,是写入完成后自增下标对应的未初始化内存
- 循环边界写错导致数组越界,触发未定义行为
逐行拆解原代码逻辑
你看到的-858993460不是随机值,是Windows平台VS编译器Debug模式下,特意填充在未初始化栈内存的标记值0xCCCCCCCC,转换成32位有符号整数正好是-858993460,作用就是提示开发者访问了未初始化的内存。
以第一次循环为例,初始myInt = 0,执行顺序完全不符合预期:
- 执行
myArray[myInt] = myInt:仅给myArray[0]赋值为0,此时myInt的值仍为0 - 执行
myInt++:myInt自增为1 - 执行打印语句:你读取的是
myArray[1],这个位置从来没被赋值过,自然读到填充值-858993460
后续每一轮循环都是同理:你给下标i的位置赋值,自增后读下标i+1的未初始化位置,所以永远打印异常值。
另外你的数组长度是10,合法下标范围是0~9,循环条件写myInt <=10会最终访问到myArray[10],属于数组越界,是标准的未定义行为。
为什么调整语句顺序后看似正常
你修改后的代码依然存在逻辑错误和越界问题:
while(myInt <= 10) { myInt++; myArray[myInt] = myInt; }
第一轮循环时myInt初始为0,先自增为1再给myArray[1]赋值,意味着myArray[0]永远不会被赋值;最后一轮循环myInt=10时进入循环,自增为11后会写myArray[11],越界范围比原代码更大。你觉得“正常打印”只是因为越界写入暂时没破坏栈上关键数据,打印时恰好读到了你写入的连续值,本质是错误代码的偶然正常,不具备可复现性。
正确写法参考
严格遵守数组下标范围,调整执行顺序保证赋值、打印操作针对同一个下标:
int myInt = 0; int myArray[10] = {}; // 初始化全部元素为0 // 数组长度为10,合法下标0~9,循环条件用<10避免越界 while(myInt < 10) { myArray[myInt] = myInt; // 先打印当前下标的值,再自增 std::cout << "Test " << myArray[myInt] << std::endl; std::cout << "Counter " << myInt << std::endl; myInt++; }
内容的提问来源于stack exchange,提问作者ANullPtr
相关产品推荐
相关产品推荐

