数组打印出来-858993460

Array printing out -858993460

我一直在尝试找出为什么我的数组使用以下代码打印出 -858993460

int myInt = 0;
int myArray[10]; // I know this is undefined, but the same results occur if I put {} to initialize it

while(myInt <= 10)
{
    myArray[myInt] = myInt;
    myInt++;
    std::cout << "Test " << myArray[myInt] << std::endl;
    std::cout << "Counter " << myInt << std::endl;
}

打印出来时,myInt 递增很好。但是,myArray 打印出 -858993460。如果我插入一个断点并在每次迭代时跨过 while 循环,我可以看到数字被送入数组,但它只打印出那个随机数(假设它是来自 stack/heap? ).

现在,如果我交换 while 循环,那么现在是

while(myInt <= 10)
{
    myInt++;
    myArray[myInt] = myInt;
}

它正确地打印出数字。我似乎无法弄清楚这里发生了什么...

C(以及扩展 C++)中的数组从零开始,因此十个元素的数组索引为 09

但是您的循环试图通过 10 访问元素 0myArray[10]实际上是数组的第十一个元素,实际上并不存在。试图改变它是未定义的行为。您的原始代码实际上更接近正确;你的修订版只会让情况变得更糟。你想要的是:

int myInt = 0;
int myArray[10]; 
while(myInt < 10)  // <- strictly LESS THAN
{
   myArray[myInt] = myInt;
   ++myInt; // <- increment AFTER accessing/assigning
}

在评论中,您添加了一个附加要求,即 myArray[0] 应包含 1 等等。为此,您需要在修改索引之前访问元素。你可以用两个变量来做到这一点:

int myInt = 0;
int myArray[10]; 
while(myInt < 10)  
{
   myArray[myInt] = myInt+1;
   ++myInt; 
}

You can't combine the two,不幸的是:

int myInt = 0;
int myArray[10]; 
while(myInt < 10) 
{
   myArray[myInt] = ++myInt;  // <- NOPE: wrong order
}

在您尝试打印值的修订代码中,您在更改 MyInt 后尝试访问 myArray[MyInt]。所以你现在看到的是一个不同于你刚刚设置的元素。毫不奇怪,它没有打印出你想要的东西!只需将增量移动到末尾即可:

while(myInt <= 10)
{
    myArray[myInt] = myInt+1;
    std::cout << "myArray [" << myInt << "] = " << myArray[myInt] << '\n';
    ++myInt;  <- ALWAYS INCREMENT THE LOOP INDEX LAST
}

在递增 myInt 后打印 myArray[myInt]。该数组元素尚未初始化。

最后 myInt 是 10 而你的 myArray 只从 09 导致缓冲区溢出。

最后 while(myInt <= 10) 更进一步,初始化 myArray[10] 并打印 myArray[11],都在数组之外。