Array in C

Da Wikipedia, l'enciclopedia libera.

In linguaggio C le array sono strutture di dati che contengono una serie di elementi. Ogni elemento di un'array è come se fosse una variabile e contiene quindi un unico dato.

Indice

[modifica] Caratteristiche

In C, a differenza di alcuni linguaggi di programmazione ad alto livello, ogni array è caratterizzata da un'unico tipo di dati e da un numero fisso di elementi (definito al momento della creazione dell'array).

Ad esempio è possibile definire un'array di interi (int) costituita da 20 elementi. Tale array non potrà contenere dati che non siano interi né potrà contenere più di 20 elementi. (vedi la sezione Buffer overflow)

Ogni elemento dell'array è identificato da un indice, cioè un numero intero che rappresenta la posizione di quell'elemento nell'array. Gli indici possibili vanno da 0 al numero di elementi dell'array diminuito di uno. Quindi il primo elemento sarà identificato dall'indice 0, il secondo dall'indice 1, il terzo dall'indice 2 e così via. In C non è possibile associare a un elemento di un'array un indice che non sia un numero intero (cioè non è possibile creare array associative).

[modifica] Sintassi

Per dichiarare un array (allocato nella memoria stack) in C si usa questa sintassi:

tipo nome[numero di elementi];

Per esempio il codice

 int mioarray[10];

definisce un'array chiamata mioarray composta da 10 elementi di tipo intero (int).

Per costruire un analogo array allocato dinamicamente nella memoria heap in C si deve operare così:

int *mioarray = (int *) malloc(sizeof(int) * dim);

dove dim può essere conosciuto anche a runtime.

Per accedere ad un elemento di un qualsiasi array si usa questa sintassi:

nome[indice]

Per esempio il codice

 mioarray[4] = 1;

modifica il 5° elemento (N.B.: il 5° non il 4°) dell'array mioarray inserendovi il valore 1.

[modifica] Array multidimensionali

In C è possibile creare array multidimensionali, cioè array in cui ci sono due o più indici.

Per esempio il codice:

 int mioarray[10][10];

crea un'array bidimensionale con 100 elementi, ognuno identificato da una coppia di indici (compresi fra 0 e 9).

Le array multidimensionali possono essere viste come delle array monodimensionali i cui elementi sono a loro volta delle array. Quindi l'array int mioarray[10][20]; si può immaginare come un'array di 10 elementi nella quale ogni elemento è a sua volta un'array di 20 elementi di tipo intero.

[modifica] Array e puntatori

In C c'è un legame molto stretto fra array e puntatori. Infatti il nome associato a un'array rappresenta un puntatore al primo elemento dell'array.

Osservare il codice seguente:

int a[10];
int *p;
 
p = a; /* assegna al puntatore p l'indirizzo del primo elemento di a */
 
a[0] = 1;
p[0] = 1;
*a = 1;
*p = 1;
/* tutte assegnano 1 al primo elemento dell'array */
 
a[4] = 1; 
p[4] = 1; 
*(a + 4) = 1;
*(p + 4) = 1;
/* tutte assegnano 1 al quinto elemento dell'array */

Non è però valido scrivere:

a = p;

in quanto a rappresenta l'indirizzo dell'array ed è una costante.

[modifica] Buffer overflow

Per approfondire, vedi la voce buffer overflow.

Quando si accede ad una posizione dell'array oltre i suoi limiti (per esempio accedendo all'11° elemento in un'array da 10 elementi), si verifica il buffer overflow, cioè vengono letti o scritti dei dati in un'area di memoria che non appartiene all'array. Il linguaggio C, infatti, non prevede nessun tipo di controllo sulle dimensioni delle array in fase di esecuzione.

Spesso il buffer overflow è generato da dati scorretti ricevuti in input e porta all'interruzione dell'esecuzione del programma con un errore. Il buffer overflow, inoltre, può essere sfruttato dagli hacker per eseguire operazioni non consentite su un sistema. Infatti creando appositamente dei dati da inviare al programma è possibile generare un buffer overflow e modificare il comportamento del programma a proprio favore.

[modifica] Voci correlate

Strumenti personali