¿Cómo funciona sizeof (Array)?

¿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?

sizeof(array) es implementado completamente por el comstackdor C. Para cuando se vincula el progtwig, lo que parece una llamada de sizeof() se ha convertido en una constante.

Ejemplo: cuando comstack este código C:

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

usted 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 

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

sizeof es tiempo de comstackción puro en C ++ y C antes de C99. A partir de C99 hay 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; } 

Eso evaluará el sizeof operando, porque n aún no se conoce en el momento de la comstackción. Eso solo se aplica a las matrices de longitud variable: otros operandos o tipos todavía hacen tamaño de cálculo en tiempo de comstackción. En particular, las matrices con dimensiones conocidas en tiempo de comstackció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 comstackció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 comstackdor (el estándar C permite que una implementación tenga extensiones a lo que trata como constante).

sizeof() solo funcionará para una matriz de tamaño fijo (que puede ser estática, basada en stack 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 comstackción.

sizeof da el tamaño de la variable, no el tamaño del objeto al que apunta (si hay uno). sizeof(arrayVar) devolverá el tamaño de la matriz en bytes si y solo si arrayVar se declara en el scope 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) 

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

¿Quizás le interese implementar la verificación de límites? Si es así, hay varias maneras diferentes de hacerlo.