2010-05-05 20 views
24

Come trovare la dimensione di una matrice intera in C.Come trovare la dimensione della matrice integer

Qualunque metodo disponibile senza muovere l'intero array volta, di scoprire la dimensione della matrice.

+14

Come hai fatto a implementare questo array? In linea di principio, si conosce la dimensione dell'array in O (1) (dimensione nota), O (N) (terminata da zero) o impossibile. – kennytm

+0

Di solito gli array vengono creati come variabili statiche e durante la sua creazione è necessario aver passato un po 'di tempo. – Jack

+1

@Jack: Perché gli array "di solito" sono statici ??? – sbi

risposta

72

Se la matrice è una variabile globale, statica o automatica (int array[10];), quindi sizeof(array)/sizeof(array[0]) funziona.

Se è un array assegnato dinamicamente (int* array = malloc(sizeof(int)*10);) o passato come argomento di funzione (void f(int array[])), non è possibile trovare le sue dimensioni in fase di esecuzione. Dovrai memorizzare la dimensione da qualche parte.
Si noti che sizeof(array)/sizeof(array[0]) compila bene anche per il secondo caso, ma produrrà silenziosamente il risultato errato.

+0

Forse menzionare e indicare una domanda che spiega il decadimento della matrice? Argomento frequente –

+1

Per i novizi C++ che arrivano a questa domanda C: [Tutto ciò che avreste sempre voluto sapere sugli array in C++] (http://stackoverflow.com/q/4810664/140719) in una FAQ. – sbi

+0

http://stackoverflow.com/questions/5493281/c-sizeof-a-passed-array – delive

-1
int len=sizeof(array)/sizeof(int); 

Dovrebbe funzionare.

+2

No - in molti casi questo * non * funzionerà. –

+2

Funziona, tuttavia 'site_t len ​​= sizeof (array)/sizeof (array [0]);' è un po 'migliore (cioè funziona ancora quando è stato modificato il tipo di dati degli elementi dell'array. –

+4

@Grzegorz: mostraci come funziona per questo array: 'void f (int array []) {site_t len ​​= sizeof (array)/sizeof (array [0]);}' – sbi

4

Se array è allocato statico:

size_t size = sizeof(arr)/sizeof(int); 

caso di array è dinamico allocato (cumulo):

int *arr = malloc(sizeof(int) * size); 

cui dimensione variabile è una dimensione del arr.

3

_msize(array) in Windows o in Linux malloc_usable_size(array) dovrebbe funzionare per la matrice dinamica

Entrambi si trovano all'interno malloc.h ed entrambi restituiscono un size_t

+1

Sono utili, ma non molto portatili ... – glglgl

Problemi correlati