Lunghezza array interi in C

abaco90
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;
}

Risposte
apatriarca
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.

abaco90
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?

vict85
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.
#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.

apatriarca
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.