数组打印出来-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++)中的数组从零开始,因此十个元素的数组索引为 0
到 9
。
但是您的循环试图通过 10
访问元素 0
。 myArray[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
只从 0
到 9
导致缓冲区溢出。
最后 while(myInt <= 10)
更进一步,初始化 myArray[10]
并打印 myArray[11]
,都在数组之外。
我一直在尝试找出为什么我的数组使用以下代码打印出 -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++)中的数组从零开始,因此十个元素的数组索引为 0
到 9
。
但是您的循环试图通过 10
访问元素 0
。 myArray[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
只从 0
到 9
导致缓冲区溢出。
最后 while(myInt <= 10)
更进一步,初始化 myArray[10]
并打印 myArray[11]
,都在数组之外。