I've written the following code in C:
 #include <stdio.h>
 #include <stdlib.h>
 #define LEN 100 
 int main(void) 
 {
    int arr[LEN];
    int i;
    for (i = 0; i < LEN; i++)
       printf("%d ", arr[LEN]);
    getchar();
    return 0;
 }
First, notice I'm deliberately accessing memory which isn't part of the array (the last cell will be in index LEN-1 and I'm accessing arr[LEN], not arr[i].
The weird result is that when I run the program, it prints all the numbers between 0 to... LEN-1. For exmaple, when LEN defined to be 100 like here, the output is:
0 1 2 ..... 99
Please run the program. Does it happens to you too? I think this is platform-dependant behavior. (If it is relevant, I ran this code on Windows 7.)
Why does the value of arr[LEN] change?
The stack is where local variables are kept. Your compiler is using the memory location after the array (arr[LEN] basically) to keep i. Therefore you are accidentally printing out i on each iteration. A different compiler might keep i somewhere else and you wouldn't see the same thing.
To expand on the answers of others, consider the following:
Code
#include <stdio.h>
#include <stdlib.h>
#define LEN 100 
int main(void) 
{
    int i;
    int arr[LEN];
    printf("&arr[LEN]: %p\n", &arr[LEN]);
    printf("&i:        %p\n", &i);
    return 0;
}
Output
&arr[LEN]: 0x7fff5cf90a74 &i: 0x7fff5cf90a74
On my machine, if i is declared before arr, i and arr[LEN] have the same address.
Run the following on your machine
#include <stdio.h>
#include <stdlib.h>
#define LEN 100 
int main(void) 
{
    int arr[LEN];
    int i;
    printf("&arr[LEN]: %p\n", &arr[LEN]);
    printf("&i:        %p\n", &i);
    return 0;
}
You should see something very similar (addresses different, of course) to what I saw.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With