Concetti Chiave
- Gli array non possono essere restituiti dalle funzioni, ma possono essere passati come argomenti, richiedendo un secondo argomento per la loro dimensione.
- Quando si gestiscono array multidimensionali, è obbligatorio specificare le dimensioni a partire dalla seconda dimensione per calcolare correttamente gli indirizzi di memoria.
- Il passaggio degli array per indirizzo consente di evitare l'overhead di copia, migliorando l'efficienza nella gestione di array di grandi dimensioni.
- Funzioni con parametri di tipo array possono essere insicure, poiché possono causare problemi di buffer overflow e non sono protette dal linguaggio C.
- Gestire array multidimensionali come parametri di funzione è complesso e limitato, rendendo necessaria l'uso di memoria dinamica per dimensioni generiche.
Indice
Limitazioni degli array come argomenti
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.
Gestione degli array multidimensionali
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.
Vantaggi del passaggio per indirizzo
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.
Domande da interrogazione
- Quali sono le limitazioni degli array quando vengono utilizzati come argomenti in una funzione?
- Come si gestiscono gli array multidimensionali nelle funzioni?
- Quali sono i vantaggi del passaggio per indirizzo degli array?
Gli array non possono essere restituiti come valori da una funzione e, se passati come argomenti, si riferiscono solo alla prima cella. Per evitare confusione, è necessario fornire anche la dimensione dell'array (come indicato nel testo).
Quando si utilizzano array multidimensionali come argomenti, è obbligatorio specificare le dimensioni a partire dal secondo argomento, poiché il compilatore deve calcolare correttamente gli indirizzi di memoria. Tuttavia, è possibile invocare funzioni con array di dimensioni non compatibili, sebbene ciò possa generare warning e comportamenti indefiniti (come descritto nel testo).
Il passaggio per indirizzo consente di operare su array di grandi dimensioni senza la necessità di copiarli, migliorando l'efficienza. Inoltre, evita problemi di buffer overflow, poiché le funzioni con array come parametri possono essere insicure (come evidenziato nel testo).