Quelle variabili e quell'array sono nello stack. Considera questo codice, che è più breve (in C).
C:
#include <stdio.h>
int main()
{
int var = 1;
int array[2];
array[2] = 100;
printf("%d\n", var);
return 0;
}
Ho compilato con gcc. Il risultato è, forse ti sorprenderà, 100. Questo perchè l'array è di 2 dimensioni; subito dopo sullo stack ci sarebbe la variabile 'var', ma uscendo dal limite superiore dell'array vai a sovrascrivere la cella di memoria destinata invece alla variabile.
Ho modificato leggermente il codice:
C:
#include <stdio.h>
int main()
{
int var = 1;
int array[2];
array[2] = 100;
printf("%d\n", var);
printf("Indirizzi: %p | %p\n", &array, &var);
return 0;
}
L'output evidenzia quelli che sono gli indirizzi: il primo elemento del vettore e quello della variabile.
Codice:
100
Indirizzi: 0060FEA4 | 0060FEAC
0x0060FEA4 è quindi array[0]; va da sè che array[1] sia 0x0060FEA8 ed array[2] invece 0x0060FEA8C, che è lo stesso dell'indirizzo della variabile.
L'array è semplicemente uno spazio allocato, in questo caso staticamente, di un certo numero di elementi. In alcuni linguaggi (Java ad esempio) vengono sollevate eccezioni quando si superano i limiti di un array, in altri no.
Non so se sai cosa accade quando accedi ad un array nella pratica. L'indice che passi tra parentesi viene in realtà moltiplicato per la dimensione degli elementi che contiene; questo valore viene sommato all'indirizzo del primo elemento.
Per essere chiaro: se hai un array di int, dell'ampiezza di 32bit, ovvero 4 byte, ed accedi alla posizione 0, accade questo:
Codice:
(0 * 4) + 0x0060FEA4 = 0x0060FEA4 // Primo elemento
(1 * 4) + 0x0060FEA4 = 0x0060FEA8 // Secondo elemento
(2 * 4) + 0x0060FEA4 = 0x0060FEAC // Terzo elelemento
nel caso sopra riportato non si trova il terzo elemento, ma si sovrascrive lo stack.