Concetti Chiave

  • In C, gli array non possono essere restituiti come valori di ritorno, ma possono essere passati come argomenti, richiedendo la specifica della loro dimensione.
  • Quando si utilizzano array multidimensionali come argomenti, è obbligatorio specificare le dimensioni a partire dal secondo argomento per garantire il corretto calcolo degli indirizzi di memoria.
  • Il passaggio di array per indirizzo è vantaggioso poiché consente di lavorare con array di grandi dimensioni senza doverli copiare, migliorando l'efficienza della memoria.
  • Le funzioni che ricevono array come parametri possono essere insicure e soggette a problemi di buffer overflow, poiché il linguaggio C non offre protezioni in questo contesto.
  • Gestire array multidimensionali come parametri di funzione è complesso, poiché non supportano dimensioni generiche, ma si può ricorrere alla memoria dinamica per ovviare a tale limitazione.

Argomenti array nelle 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.

Array multidimensionali e compilatore

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

  1. Qual è la principale limitazione nell'uso degli array come valore di ritorno di una funzione?
  2. Non è possibile restituire un array come valore di ritorno di una funzione; gli array possono solo essere passati come argomenti, e se non si specifica la dimensione, si fa riferimento solo alla prima cella dell'array (come indicato nel testo).

  3. Perché è necessario specificare le dimensioni degli array multidimensionali nelle funzioni?
  4. È obbligatorio specificare le dimensioni degli array multidimensionali dopo il primo argomento per permettere al compilatore di calcolare correttamente gli indirizzi di memoria degli elementi, evitando comportamenti non definiti (come spiegato nel testo).

  5. Quali sono i vantaggi del passaggio di array per indirizzo nelle funzioni?
  6. Passare gli array per indirizzo consente di operare su array di grandi dimensioni senza il costo di una copia, gestendo in modo efficiente la memoria e riducendo il rischio di problemi di buffer overflow, come evidenziato nel testo.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community