2010-05-05 9 views
24

Cómo encontrar el tamaño de una matriz de enteros en C.Cómo encontrar el tamaño de matriz de enteros

cualquier método disponible sin atravesar toda la matriz de una vez, para averiguar el tamaño de la matriz.

+14

¿Cómo se decide implementar esta matriz? En principio, o bien conoce el tamaño de la matriz en O (1) (tamaño conocido), O (N) (terminado en nulo) o imposible. – kennytm

+0

Normalmente las matrices se crean como variables estáticas y debe haber pasado algo de longitud al crearlas. – Jack

+1

@Jack: ¿Por qué las matrices "normalmente" serían estáticas? – sbi

Respuesta

72

Si la matriz es una variable global, estática o automática (int array[10];), entonces sizeof(array)/sizeof(array[0]) funciona.

Si se trata de una matriz asignada dinámicamente (int* array = malloc(sizeof(int)*10);) o pasa como un argumento de función (void f(int array[])), entonces no puede encontrar su tamaño en tiempo de ejecución. Tendrás que almacenar el tamaño en alguna parte.
Tenga en cuenta que sizeof(array)/sizeof(array[0]) se compila muy bien incluso para el segundo caso, pero silenciosamente producirá el resultado incorrecto.

+0

¿Quizás mencionar y señalar una pregunta que explique la disminución de la matriz? Tema frecuente –

+1

Para los novatos de C++ que llegan a esta pregunta en C: [Todo lo que siempre quiso saber acerca de las matrices en C++] (http://stackoverflow.com/q/4810664/140719) en una pregunta frecuente. – sbi

+0

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

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

Debería funcionar.

+2

No, en muchos casos esto * no * funcionará. –

+2

Funciona, sin embargo 'site_t len ​​= sizeof (array)/sizeof (array [0]);' es un poco mejor (es decir, todavía funciona cuando se ha cambiado el tipo de datos de los elementos de la matriz. –

+4

@Grzegorz: Muéstranos cómo funciona para esta matriz: 'void f (int array []) {site_t len ​​= sizeof (array)/sizeof (array [0]);}' – sbi

4

Si matriz es estática asignaron:

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

si array es dinámica asignada (montón):

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

donde el tamaño variable es una dimensión de la arr.

3

_msize(array) en Windows o Linux en malloc_usable_size(array) deben trabajar para la matriz dinámica

Ambos se encuentran dentro malloc.h y ambos devuelven un size_t

+1

Son útiles, pero no son muy portátiles ... – glglgl

Cuestiones relacionadas