2010-11-29 12 views
6

¿Hay alguna manera de acelerar la obtención de un tamaño de matriz en C?¿Hay algún atajo para el tamaño/longitud de la matriz en C?

Mecanografiar sizeof(array)/sizeof(int) cada vez que envejece. ¿Alguna biblioteca C tiene algo así como .length o hay alguna manera en que puedo definir sizeof(array)/sizeof(int) como una constante más corta de algún tipo (también es posible usar la notación de puntos)?

+0

posible duplicado de [¿Hay una función estándar en C que devuelva la longitud de una matriz? ] (http://stackoverflow.com/questions/1598773/is-there-a-standard-function-in-c-that-would-return-the-length-of-an-array) –

+0

El tratamiento de C de las matrices es la fuente de una gran cantidad de acidez. –

Respuesta

11

Usted puede utilizar sizeof(array)/sizeof(*array) y hacer una macro.

#define length(array) (sizeof(array)/sizeof(*(array))) 
+0

Wow, no lo sabía. ¡Hoy aprendí algo nuevo! –

+0

¿Entonces el puntero obtendrá el tipo de matriz? – ubiquibacon

+0

@typoknig '* array' es lo mismo que' array [0] ' –

3

Siempre puedes escribir una macro para hacerlo. Tenga en cuenta que no funcionará como una función, ya que tendría que degradar la matriz a un puntero a su primer elemento, por lo que simplemente devolvería sizeof(int *)/sizeof(int).

#define INTSIZE(array) (sizeof(array)/(sizeof(int)) 

O, en términos más generales ...

#define SIZE(array, type) (sizeof(array)/(sizeof(type)) 

Wow, downvotes. De acuerdo, esto también funcionará:

#define SIZE(array) (sizeof(array)/(sizeof((array)[0])) 
+2

-1 para el tipo innecesario –

+0

Para ampliar el comentario de Let_Me_Be, puede escribir 'sizeof arr/sizeof * arr' y no preocuparse por el tipo * en absoluto * (aunque en el contexto de una macro puede ser más seguro escribirlo como' (sizeof (arr)/sizeof * (arr) '). –

+2

En serio? Votos abajo? Suboptimal no es incorrecto – nmichaels

11

Todas las soluciones en C se reducen a una macro:

#define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0])) 
+0

+1 Para" Todas las soluciones en C se reducen a una macro: " –

+0

+1. MSVC también tiene este como '_countof'. – Kos

2

La respuesta corta es "no"; en C, no hay forma de obtener la cantidad de elementos en una matriz según la expresión de matriz sola. El truco sizeof es casi tan bueno como se puede esperar, y su uso está limitado a las expresiones del tipo de matriz. Por lo que el siguiente no funcionará:

char *foo = malloc(1024); 
size_t count = sizeof foo; 

count recibe el número de bytes para el tipo de puntero (4 en una arquitectura típica de escritorio), no en el bloque asignado.

char arr[100]; 
char *p = arr; 
size_t count = sizeof p; 

Igual que el anterior.

void foo(char *arr) 
{ 
    size_t count = sizeof arr; // same as above 
    ... 
} 

void bar(void) 
{ 
    char array[100]; 
    foo(array); 
    ... 
} 

Igual que el anterior.

Si necesita saber cuántos elementos hay en una matriz, debe rastrear esa información por separado.

El tratamiento de las matrices de C es la fuente de un lote de acidez estomacal.

Cuestiones relacionadas