Lezione 8, le array

Nel 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.
La differenza sostanziale nel linguaggio C e che le array contengono un unico tipo dato e da un numero fisso di elementi stabilito al momento della creazione.
Ogni elemento dell’array è identificato da un indice, un numero intero che indica la posizione dell’informazione, il primo elemento parte dallo zero in senso decrescente, quindi se necessitano 10 elementi interi la nostra array avrà questa forma.

1
int miaarray[19];

Come vedete ho creato 20 miaarray intere, sono 20 perchè la numerazione parte da 0 e finisce a 19.
Per accedere alle array si usa la seguente sintassi (prendo come riferimento l’array creata in precedenza.

1
miaarray[2] = 56;

Quindi alla terza array assegno il valore di 56, comunque esiste anche un metodo per assegnare tutti i valori senza dover dichiarare uno alla volta e la sintassi è la seguente.

1
miaarray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

Nel caso delle char esse vengono già definite come array per il principio detto all’inizio, forse con un esempio posso chiarire meglio:

1
2
char miaarray;
miaarray = "Hello Word!";

Questo non è altro:

1
2
char miaarray[10];
miarray[] = {"H", "e", "l", "l", "o", " ", "W", "o", "r", "d", "!"};

Questo può comportare alcuni problemi quando dobbiamo assegnare ad un determinato indice un valore alfanumerico, perchè nell’array alfanumerico si può assegnare un solo carattere, per risolvere il problema possiamo ricorrere ad array multidimensionali, cioè ad array con più indici, come al solito preferisco fare un esempio per illustrare meglio la sintassi:

1
2
int miaarray[10][10];
miaarray[0][5] = 4;

Il risultato è facilmente intuibile ho definito una miaarray intera con 2 indici da 11 elementi, tra cui all’indice 0,5 ho assegnato il valore 4.
Un altro argomento importante è il legame tra array e puntatori.
Innanzitutto definiamo i puntatori:
Un puntatore e’ un tipo di dato, una variabile che contiene l’indirizzo in memoria di un’altra variabile. Si possono avere puntatori a qualsiasi tipo di variabile. La dichiarazione di un puntatore include il tipo dell’oggetto a cui il puntatore punta. In C ogni variabile ha due tipi di valori: una locazione e un valore contenuto in quella locazione.
Prendiamo come esempio il seguente codice.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 */

Innanzitutto da notare che l’array intera “a” contiene 11 elementi, e la variabile “p” è un puntatore questo viene definito grazie all’asterisco davanti alla variabile durante l’assegnazione del tipo.
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 si verifica il buffer overflow questo è 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.

RiujiAndy

Tratto e concesso da: http://ryujiandy.ath.cx/

Related Posts with Thumbnails

Filed Under: Programmazione

Tags: