PDA

Visualizza la versione completa : [C] Lunghezza di un array di interi


ProDan
10-03-2011, 12:01
Ciao a tutti,
mi sto (ri)avvicinando al C e sono un po' arruginito.
Voglio determinare la lunghezza di un array di interi. Tutto bene usando sizeof(array).
con array definito staticamente. Se definisco invece un puntatore all'array come fatto nel codice riportato, la dimensione che mi viene restituita e' quella del puntatore.



#include <stdio.h>

main() {

int dim,i,val;
int *a;

printf("quanti elementi nell'array?\n");
scanf("%d", &dim);

int testArray[dim];

for(i=0; i<dim; i++) {
printf("Elemento %d:", i);
scanf("%d",&val);
testArray[i] = val;
}

a=testArray;

printf("Misura array a (pointer): %d\n", sizeof(a)/sizeof(int));
printf("Misura array arrayTest (statico): %d\n", sizeof(testArray)/sizeof(int));

printf("%d %d %d\n", testArray, a, &testArray[0]);

}


Ma nome dell'array e puntatore all'indirizzo [0] sono la stessa cosa?
Come faccio a determinare la lunghezza della array tramite il puntaore al primo elemento, il che ad esempio puo' succedere con l'allocazione dinamica di memoria?

Grazie

jobv
10-03-2011, 12:37
Ciao,

non vorrei iniziare a sparare cavolate e spero che qualche :old: del forum possa smentirmi subito nel caso mi sbaglio:

1) sizeof() non è una funzione di libreria ma un'operatore del linguaggio, quindi intrinseco al compilatore. Quando compili un codice con una chiamata del tipo:

int array[10];
sizeof(array)
il compilatore si comporta come se tu avessi scritto (per comprenderci): "sizeof(int *)*10".
Questo non accade se invece array fosse un int*.

2) l'allocazione dinamica presuppone che tu abbia fatto una malloc (o simile)...ma, qualsiasi funzione tu abbia usato per allocare, devi aver specificato la dimensione dell'array (con una cosa del tipo: malloc(10*sizeof(int))! Quindi...a cosa ti serve usare sizeof() per ricavare la dimensione?

3) Non credo che questo sia corretto (anche se non comporta errori di compilazione...almeno sul tuo compilatore :D ):

scanf("%d", &dim);
int testArray[dim];
A cosa servirebbe l'allocazione dinamica se fosse possibile fare una cosa del genere?

shodan
10-03-2011, 12:43
sizeof(int)*10


3) Non credo che questo sia corretto.

Il C++ non usa estensioni del C99, quindi un compilatore C++ decente deve proprio rifiutare quella porcata. Il che può dirla lunga sulla qualità dei compilatori C++ che invece l'accettano.

jobv
10-03-2011, 13:05
il compilatore si comporta come se tu avessi scritto (per comprenderci): "sizeof(int *)*10".
Esatto, vole dire sizeof(int)*10 :D
Grazie!

ProDan
10-03-2011, 13:32
Ciao Jobv,
grazie delle tue risposte, pero' ancora non mi e' chiara una cosa. Al di la' del fatto che come dici al punto 2 (ed io condivido) ha scarso senso la mia domanda nel caso di allocazione dinamica, sarebbe possibile capire la dimensione dell'array di interi? Non esiste un elemento finale tipo lo '\0' usato per le stringhe, giusto?

Poi,solo per precisazione,



scanf("%d", &dim);

int testArray[dim];

mi risulta sia consentito dall'estensione C99. O sbaglio?

Grazie

jobv
10-03-2011, 13:45
Solo le stringhe hanno il terminatore da quanto mi risulti.

Riguardo alle estensioni credo che tu abbia pienamente ragione!

Loading