2009-12-14 15 views
26

En C, tengo una serie de estructuras define como:¿Resultado de 'sizeof' en la matriz de estructuras en C?

struct D 
{ 
    char *a; 
    char *b; 
    char *c; 
}; 

static struct D a[] = { 
    { 
     "1a", 
     "1b", 
     "1c" 
    }, 
    { 
     "2a", 
     "2b", 
     "2c" 
    } 
}; 

me gustaría para determinar el número de elementos de la matriz, pero sizeof(a) devuelve un resultado incorrecto: 48, No 2. ¿Estoy haciendo algo mal, o es sizeof simplemente no confiable aquí? Si es importante, estoy compilando con GCC 4.4.

+0

Ver http://stackoverflow.com/questions/1598773/is-there-a-standard-function-inc-c-hat-would-return-the-length-of-an-array/1598827#1598827 for una respuesta que incluye algunos hacks para hacer que las técnicas publicadas a continuación sean más seguras. –

Respuesta

27
sizeof a/sizeof a[0]; 

Este es un tiempo de compilación constante, por lo que se puede utilizar para, por ejemplo, crear otra matriz:

#define N sizeof a/sizeof a[0] 
int n_a[N]; 
+0

En este caso, si sizeof (a) es 48, sizeof (a [0]) == 24. Eso hace que cada char * ocupe 8 bytes. sizeof (char *) probablemente sea 4 u 8, dependiendo de 32 bits/64 bits, pero los compiladores alinearán por palabras los miembros de la estructura, por lo que cada elemento termina tomando 8 bytes. – jmanning2k

+1

Sí, pero lo bueno es que la división da el tamaño correcto, ya sea que haya relleno o no, o lo que sea que sea del tamaño de la 'estructura'. –

+0

#define no debe tener un punto y coma al final – Paamand

37

sizeof le da el tamaño en bytes, no el número de elementos. Como dice Alok, para obtener la cantidad de elementos, divida el tamaño en bytes de la matriz por el tamaño en bytes de un elemento. El lenguaje C correcta es:

sizeof a/sizeof a[0] 
+7

+1 para dar una mejor explicación. –

+10

Una versión alternativa, tan idiomática es 'sizeof a/sizeof * a' – caf

7

sizeof devuelve el tamaño en memoria del elemento pasado. Al dividir el tamaño de una matriz por un solo tamaño de elemento, obtienes la cuenta de los elementos.

Tenga en cuenta que el tamaño del elemento también puede incluir algunos bytes de relleno. Por esta razón, una estructura acolchada (por ejemplo, cuando un miembro char es seguido por un puntero) tendrá un valor sizeof mayor que su suma de tamaño de miembros.

Por otro lado, no deje que le moleste al contar elementos en una matriz: sizeof(a)/sizeof(a[0]) seguirá funcionando sin problemas como se esperaba.

Cuestiones relacionadas