Mi permetto di dissentire.
Quello che volevo evidenziare con il mio esempio è che gli array in C non esistono, per lo meno non come tipo dati. In C le parentesi quadre sono un semplice operatore binario che permette di lavorare con i puntatori, e nient'altro. Un array in informatica è molto più di questo.
Quando dichiari una variabile con le parentesi quadre nella definizione, stai dichiarando un area di memoria divisa in ipotetici spazi contigui, è vero, ma il nome diventa un puntatore a tutti gli effetti ai fini del codice, non un ipotetico "typeof Array", la differenza è solo nella compilazione. Es.:
Codice: Seleziona tutto
#include "stdio.h"
#include "stdlib.h"
int
main (void)
{
int a[2] = {1};
int *b = a;
printf("a &%p *%p = %d\nb &%p *%p = %d\n", &a, a, *a, &b, b, *b);
return 0;
}
output:
Codice: Seleziona tutto
samuele@nuitari-laptop:~$ gcc -Wall check2.c && a.out
a &0xbfeb41bc *0xbfeb41bc = 1
b &0xbfeb41b8 *0xbfeb41bc = 1
Per cui, per quale motivo dovrebbe un compilatore C fare dei controlli sull'indice che metti all'interno delle parentesi quadre? Lui sa che vuoi dereferenziare il puntatore, nient'altro. Se poi vai a leggere o scrivere in un area di memoria inizializzata o meno, questo è affar tuo.
Possono esistere 1000 casi che invalidano il controllo sugli array. Ad esempio, potresti aver liberato una porzione di memoria dell'array, ed in runtime otterresti comunque una violazione di accesso all'area di memoria, per quanto l'indice possa essere valido. Oppure potresti voler utilizzare la parentesi quadra per accedere ai membri di una struttura o di un oggetto. E li che tipo di controllo dovrebbe essere fatto?
Il concetto di array inteso come tipo dati è ben più di alto livello, proprio di altri linguaggi di programmazione come il Basic od il Java, o di librerie apposite. E' per questo che ho detto che ha più senso usare la STL per cose del genere. Oppure, non volendo utilizzare il C++, si potrebbe semplicemente definire un set di comode funzioni (array_create, array_get, array_set, array_free, etc) ed usarle per l'accesso, all'interno delle quali fare tutti i controlli del caso (ovviamente in fase di runtime, il momento in cui va effettivamente controllato il limite di un array).
Perchè fare tutto questo per degli array? Risposta: perchè il C non implementa gli array come tipo dati, gli mancano. Se stai pensando "vorrei che il C mi controllasse i limiti sugli indici mentre uso gli array" stai facendo un errore alla base, perchè ti aspetti che il C ti faccia un controllo su un tipo dati che non c'è, che non esiste, che se lo vuoi devi programmartelo da te.