PDA

Visualizza la versione completa : [C] allocazione statica di array


stirkland
28-01-2010, 11:49
Ciao amici, ho bisogno di spiegazione nel caso di allocazione rigorosamente statica (quella dinamica CREDO di conoscerla piuttosto bene)

dunque...

nella dichiarazione di un array (anche multidimensionale) devo specificare la dimensione

int array[2][3];

oppure posso ometterla, a condizione di elencare i valori

int array[][] = {{3,4},{5,6},{7,8}};

ma NON posso fare una cosa così

int array[][3]; oppure
int array[2][]; o ancora
int array[][];

fin qua giusto?

Domanda 1: come mai quando passo un array multidimensionale a una funzione posso omettere la prima dimensione?

void funz(int b[][3]) {.....}

In paratica, come funziona la memoria nel caso di array statici?

Domanda 2: posso scrivere una funzione che ritorna un array, questo SENZA usare i puntatori? Quindi non

int* funz(...) {...}

ma

int[] funz(..) che però così come è scritto NON compila? C'è un modo?

Grazzzie! :fagiano:

MItaly
28-01-2010, 14:34
1. Gli array monodimensionali vengono passati come puntatori al primo elemento, per cui il compilatore sa che per accedere all'n-esimo elemento deve andare a guardare n elementi dopo il primo; nel caso degli array multidimensionali la questione è più complicata, visto che, per accedere all'elemento m,n il compilatore deve identificare l'inizio della riga m, e poi aggiungere n per raggiungere l'elemento desiderato. Il punto è che per raggiungere l'inizio della riga m è necessario conoscere la lunghezza di ciascuna riga, in maniera da saltare avanti, rispetto al primo elemento, di m*lunghezzariga elementi. Un discorso analogo vale per gli array a più dimensioni. È per questo, quindi, che si può omettere solo la prima dimensione: perché le altre servono per calcolare la posizione della riga dell'elemento.
2. Di sicuro non puoi restituire un array non dimensionato (come farebbe il chiamante a sapere quanto è grande effettivamente e quindi a recuperarlo dallo stack dopo la chiamata a funzione?). Non ricordo se si possa restituire un array dimensionato, ma comunque in questo caso non sussisterebbero problemi tecnici.

stirkland
28-01-2010, 15:07
OK allora la prima risposta l'ho capita! Grazie! :)

Per quanto riguarda la seconda, pensandoci meglio,non è possibile ritornare neanche un array dimensionato: un array statico è definito a tempo di compilazione, quindi scrivere, tipo nel main una cosa così:

int a[] = funz();

con funz() che ritornerebbe un array è impossibile!! Sarebbe come definire un array statico con le dimensioni non costanti (variabili)!


:ciauz:

MItaly
28-01-2010, 15:19
Sarebbe possibile farlo se le dimensioni dell'array restituito fossero dichiarate nel prototipo della funzione, ma, ribadisco, non so se il C supporta effettivamente questa caratteristica (uso di rado gli array C come valori restituiti, lavorando in C++ ci sono alternative migliori).

Loading