I've been trying to work out why my array is printing out -858993460 with the following code
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;
}
When print this out, myInt
increments fine. However, myArray
is printing out -858993460. If I insert a break point and step over the while loop with each iteration, I can see the numbers are being fed into the array, but it only prints out that random number (assuming it's a random number from the stack/heap?).
Now, if I swap around the while loop so it's now
while(myInt <= 10)
{
myInt ;
myArray[myInt] = myInt;
}
it prints out the numbers correctly. I can't seem to work out what's going on here...
CodePudding user response:
Arrays in C (and by extension C ) are zero based, so an array of ten elements is indexed 0
through 9
.
But your loop is trying to access elements 0
through 10
. myArray[10]
is actually the eleventh element of the array, which doesn't actually exist. Trying to change it is undefined behavior. Your original code was actually closer to being correct; your revised version only made it worse. What you want is:
int myInt = 0;
int myArray[10];
while(myInt < 10) // <- strictly LESS THAN
{
myArray[myInt] = myInt;
myInt; // <- increment AFTER accessing/assigning
}
In comments, you added an additional requirement that myArray[0]
should contain 1
and so forth. To get this, you need to access the element before modifying the index. You could do this with two variables:
int myInt = 0;
int myArray[10];
while(myInt < 10)
{
myArray[myInt] = myInt 1;
myInt;
}
You can't combine the two, unfortunately:
int myInt = 0;
int myArray[10];
while(myInt < 10)
{
myArray[myInt] = myInt; // <- NOPE: wrong order
}
In the revised code where you try to print out the values, you tried to access myArray[MyInt]
after you changed MyInt
. So you're now looking at a different element than the one you just set. No surprise it didn't print out what you want! Just move the increment to the end:
while(myInt <= 10)
{
myArray[myInt] = myInt 1;
std::cout << "myArray [" << myInt << "] = " << myArray[myInt] << '\n';
myInt; <- ALWAYS INCREMENT THE LOOP INDEX LAST
}
CodePudding user response:
You print myArray[myInt]
after you have incremented myInt
. That array element hasn't been initialized yet.
More over at the end myInt
is 10 and your myArray
only goes from 0
to 9
leading to a buffer overflow.
And last while(myInt <= 10)
goes even one step further, initializing myArray[10]
and printing myArray[11]
, both outside the array.