Concetti Chiave
- Gli array non possono essere usati come valore di ritorno di una funzione, ma possono essere passati come argomenti.
- Quando si passa un array come argomento, è necessario includere la dimensione dell'array per evitare di ottenere solo il riferimento alla prima cella.
- Per array multidimensionali come argomenti, le dimensioni successive alla prima devono essere specificate per garantire un corretto calcolo degli indirizzi di memoria.
- Il passaggio degli array per indirizzo è efficiente per gestire grandi dimensioni senza overhead di copia, ma può causare problemi di sicurezza come buffer overflow.
- La gestione di array multidimensionali come parametri è complicata e limitata; l'uso della memoria dinamica può essere una soluzione.
Array e funzioni
Non è possibile avere un tipo di dato array come valore di ritorno di una funzione, però gli array possono essere argomenti della funzione, è necessario però prestare attenzione poichè se come argomento viene solo inserito l’array, il riferimento è solo alla prima cella dell’array e non al contenuto intero dell’array, infatti se si applica sizeof() ad un array il risultato equivale alla dimensione di una variabile puntatore. La soluzione a questo problema è aggiungere un altro argomento che indichi la dimensione dell’array.
Se nelle funzioni uno degli argomenti e un array multidimensionale, è opzionale specificare la prima funzione ma è obbligatorio specificare quelle successive, poichè il compilatore deve calcolare in modo corretto gli indirizzi di memoria dei vari elementi, ovvero l’offset delle righe dell’array. Però, poichè C non è un linguaggio troppo rigido, è possibile invocare una funzione anche con array di dimensioni non compatibili, avvisando con un warning, che potrebbero portare a comportamenti non definiti.
Il passaggio del tipo di dato array come indirizzo è conveniente perchè:
- una funzione può operare su array molto grandi senza avere l’overhead per fare una copia dell’array
- è possibile gestire array di grandi dimensioni in modo efficiente
- è meglio evitare funzioni con argomento strutture di array ingombranti, poichè c’è il passaggio per valore
Le funzioni con array come parametri formali o variabili locali sono potenzialmente insicure, poichè potrebbero causare problemi di buffer overflow, e in questo caso C non fornisce protezioni, questi problemi vengono sfruttati per tecniche di attacco.
Gestire array multidimensionali come parametri di funzione è scomodo e ha limiti, poichè non c’è modo di gestire array multidimensionali con dimensioni generiche, in questo caso si può usare la memoria dinamica.