Lunghezza array interi in C
Ciao a tutti,
volevo sapere come si trova la lunghezza di un array di interi in C.
Io ho usato questo codice (che funziona per le stringhe) ma continua a darmi lunghezza 1; forse non va bene per gli interi?
int main () {
int m[10], i, lunghezza;
printf ("Inserisci i valori\n");
scanf ("%d", m);
for (i=0; m != '\0'; i++) { }
lunghezza = i;
i = lunghezza;
printf ("La lunghezza è %d\n", lunghezza);
return 0;
}
volevo sapere come si trova la lunghezza di un array di interi in C.
Io ho usato questo codice (che funziona per le stringhe) ma continua a darmi lunghezza 1; forse non va bene per gli interi?
int main () {
int m[10], i, lunghezza;
printf ("Inserisci i valori\n");
scanf ("%d", m);
for (i=0; m != '\0'; i++) { }
lunghezza = i;
i = lunghezza;
printf ("La lunghezza è %d\n", lunghezza);
return 0;
}
Risposte
Stai leggendo un solo valore da standard input.. Il fatto che ti restituisca 1 è un caso e cambiando compilatore o opzioni del compilatore potrebbe crashare. Per leggere più valori è necessario scrivere un ciclo e in quel caso è sufficiente contare il numero di iterazioni. Quello di far terminare le stringhe con '\0' è una convenzione solo delle stringhe, non è in generale utilizzabile in altre situazioni a meno di terminare esplicitamente i tuoi array con qualche valore specifico.
Ciao, grazie della risposta. Come posso trovare la lunghezza di un array di interi senza usare la libreria string.h e senza utilizzare valori particolari per terminare l'array?
In generale, non si può. Quando lavori con gli array devi portarti dietro la sua dimensione e preoccuparti di non uscire dai suoi limiti. Per array statici si può usare il metodo seguente, ma ricorda che la dimensione viene persa quando passi l'array ad una funzione.
Nota inoltre che anche con le stringhe la presenza dello 0 alla fine della stringa va gestita nel caso di funzioni scritte da te e non è assicurata.
#include <stdio.h> #define UNSAFE_ARRAY_SIZE( __array__ ) ( sizeof( ( __array__ ) ) / sizeof( ( __array__[0] ) ) ) int func(int a[]); int main(void) { int v[] = { 1, 2, 3, 4, 5 }; int dim = UNSAFE_ARRAY_SIZE(v); printf("Nota che %d e' diverso da %d\n", dim, func(v)); } int func(int a[]) { return UNSAFE_ARRAY_SIZE(a); }
Nota inoltre che anche con le stringhe la presenza dello 0 alla fine della stringa va gestita nel caso di funzioni scritte da te e non è assicurata.
Esistono in generale due lunghezze che possiamo associare ad un array. La prima è la quantità di memoria allocata per quel particolare oggetto. E' possibile calcolare tale quantità con il codice postato da @vict85 nel caso di array statici, ma non è in generale possibile farlo quando si ha solo accesso ad un puntatore a tale array (come avviene nel caso di passaggio dell'array ad una funzione per esempio). Il secondo concetto di lunghezza è invece associato alla frazione di array che è stata effettivamente usata. E' quello che viene calcolato con il tuo metodo per le stringhe (o usando strlen). Per questo tipo di lunghezza esistono in generale due metodi: passare la lunghezza separatamente o utilizzare un valore particolare alla fine dell'array per segnarne il termine. Personalmente credo che memorizzare le due lunghezze sia in generale una soluzione migliore, ma il linguaggio C ha fatto una scelta diversa per quanto riguarda le stringhe.