vale1411
Genius
2 min. di lettura
Vota

Concetti Chiave

  • Gli array non possono essere restituiti da una funzione, ma possono essere passati come argomenti specificando anche la loro dimensione.
  • Quando si utilizzano array multidimensionali come argomenti, è obbligatorio specificare le dimensioni, tranne la prima, per calcolare correttamente gli indirizzi di memoria.
  • Passare array come indirizzi è efficiente poiché evita l'overhead di copiatura, soprattutto per array di grandi dimensioni.
  • Le funzioni che lavorano con array possono essere insicure e suscettibili a buffer overflow, dato che C non offre protezioni intrinseche.
  • Gestire array multidimensionali con dimensioni generiche è complicato; in questi casi, si consiglia di utilizzare la memoria dinamica.

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.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community