2009-03-22 13 views
41

¿Cómo encuentra c en tiempo de ejecución el tamaño de la matriz? ¿Dónde se almacena la información sobre el tamaño de la matriz o los límites de la matriz?¿Cómo funciona sizeof (Array)

Respuesta

55

sizeof(array) se implementa en su totalidad por el compilador C. Para cuando se vincula el programa, lo que parece una llamada sizeof() ha sido convertida en una constante.

Ejemplo: cuando se compila el código C:

#include <stdlib.h> 
#include <stdio.h> 
int main(int argc, char** argv) { 
    int a[33]; 
    printf("%d\n", sizeof(a)); 
} 

se obtiene

.file "sz.c" 
    .section  .rodata 
.LC0: 
    .string "%d\n" 
    .text 
.globl main 
    .type main, @function 
main: 
    leal 4(%esp), %ecx 
    andl $-16, %esp 
    pushl -4(%ecx) 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %ecx 
    subl $164, %esp 
    movl $132, 4(%esp) 
    movl $.LC0, (%esp) 
    call printf 
    addl $164, %esp 
    popl %ecx 
    popl %ebp 
    leal -4(%ecx), %esp 
    ret 
    .size main, .-main 
    .ident "GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.1)" 
    .section  .note.GNU-stack,"",@progbits 

El $132 en el medio es el tamaño de la matriz, 132 = 4 * 33. Tenga en cuenta que no hay no call sizeof instrucción - a diferencia de printf, que es una función real.

+1

¡lol! Eso me enseñará a no verificar que ponga mis manos en el lugar correcto ...gracias por la solución Rob –

+1

Ah, ya veo, David debe ser un mecanógrafo táctil ciego con una disfunción táctil en las puntas de los dedos :-) Es curioso cómo la c y la e estaban bien - Tenía que comprobar que cada otra letra era uno a la izquierda de la posición correcta. – paxdiablo

+1

Supongo que mi mano izquierda estaba en el lugar correcto, pero mi mano derecha se desplazó una tecla hacia la izquierda ... parece un error fácil de hacer, si está escribiendo una respuesta mientras mira televisión ;-) –

7

sizeof() solo funcionará para una matriz de tamaño fijo (que puede ser estática, basada en pila o en una estructura).

Si lo aplica a una matriz creada con malloc (o nueva en C++) siempre obtendrá el tamaño de un puntero.

Y sí, esto se basa en la información de tiempo de compilación.

+0

las matrices de tamaño fijo no se basan necesariamente en la pila. C no tiene un nuevo operador. – ysth

+0

Tienes razón, voy a editar un poco. –

+3

Olvidaste de C99 VLA: matrices de longitud variable. –

2

sizeof (Array) se busca en tiempo de compilación, no en tiempo de ejecución. La información no está almacenada.

¿Está interesado en implementar la comprobación de límites? Si es así, hay varias maneras diferentes de hacerlo.

5

sizeof da el tamaño de la variable, no el tamaño del objeto que se está apuntando a (si es que existe.) sizeof(arrayVar) devolverá el tamaño de la matriz de bytes si y sólo si arrayVar se declara en su alcance como una matriz y no un puntero.

Por ejemplo:

char myArray[10]; 
char* myPtr = myArray; 

printf("%d\n", sizeof(myArray)) // prints 10 
printf("%d\n", sizeof(myPtr)); // prints 4 (on a 32-bit machine) 
17

sizeof es tiempo de compilación puro en C++ y C antes de C99. A partir de C99 existen matrices de longitud variable:

// returns n + 3 
int f(int n) { 
    char v[n + 3]; 

    // not purely a compile time construct anymore 
    return sizeof v; 
} 

que evaluará el operando sizeof, porque n aún no se conoce en tiempo de compilación. Que solo se aplica a matrices de longitud variable: Otros operandos o tipos todavía hacen tamaño de cálculo en tiempo de compilación. En particular, las matrices con dimensiones conocidas en tiempo de compilación todavía se manejan como en C++ y C89. Como consecuencia, el valor devuelto por sizeof ya no es una constante de tiempo de compilación (expresión constante). No puede usarlo cuando se requiere dicho valor, por ejemplo, al inicializar variables estáticas, a menos que lo permita una extensión específica del compilador (el estándar C permite que una implementación tenga extensiones a lo que trata como constante).

+4

Bueno eso usted menciona C99 VLAs. Sin embargo, su respuesta debe enfatizar que incluso en C99, las matrices de tamaño fijo tienen su tamaño computado en tiempo de compilación, solo son los VLA los que tienen su tamaño calculado en tiempo de ejecución. Y tal vez, como consecuencia, no siempre se pueda usar 'sizeof (array)' como una constante en C99. –

+0

oh correcto. no vi esa ambigüedad en mi respuesta. –

+0

bien, hora de dormir para mí ahora. más tarde me despertaré y gritaré sobre todos esos errores ortográficos en mis respuestas: p –