Given the code:
int vector[5] = {1, 2, 3, 4, 5};
int *pv = vector, value = 3;
for(int i = 0; i < 5; i++) {
*pv++ *= value;
}
for(int i = 0; i < 5; i++) {
printf("%d, ", *(pv+i));
}
I expect each individual element of the array pointed to by pv
to be multiplied by 3
.
Instead what I get as an output is:
32766, -1554513907, -527290408, -333409024, 32766,
What am I doing wrong?
The problem is that you incremented the pointer in the first
for
cycle in every loop, so when you get to the end of it,pv
is already pointing to one past the end ofvector
.For that reason all the values printed in the second
for
cycle represent residual values stored in addresses out of the bounds of the array, classic undefined behavior.A quick fix would be to reset the pointer in between the two cycles:
Or use the iterator
i
in both cycles, since you already have it in thefor
, you might as well use it:With this method the pointer is not incremented, it's always pointing to the beginning of the array, accessing its indexes is safe.
Note that I used array notation
[]
as it's slightly less cluttered than the pointer dereference notation.