You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数组打印输出-858993460异常问题排查

问题根因说明

你遇到的问题由两个明确的编码错误导致,和栈/堆随机值无关:

  • 你打印的从来不是刚写入的数组元素,是写入完成后自增下标对应的未初始化内存
  • 循环边界写错导致数组越界,触发未定义行为

逐行拆解原代码逻辑

你看到的-858993460不是随机值,是Windows平台VS编译器Debug模式下,特意填充在未初始化栈内存的标记值0xCCCCCCCC,转换成32位有符号整数正好是-858993460,作用就是提示开发者访问了未初始化的内存。

以第一次循环为例,初始myInt = 0,执行顺序完全不符合预期:

  1. 执行myArray[myInt] = myInt:仅给myArray[0]赋值为0,此时myInt的值仍为0
  2. 执行myInt++:myInt自增为1
  3. 执行打印语句:你读取的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:21:39