¿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
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.
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.
las matrices de tamaño fijo no se basan necesariamente en la pila. C no tiene un nuevo operador. – ysth
Tienes razón, voy a editar un poco. –
Olvidaste de C99 VLA: matrices de longitud variable. –
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.
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)
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).
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. –
oh correcto. no vi esa ambigüedad en mi respuesta. –
bien, hora de dormir para mí ahora. más tarde me despertaré y gritaré sobre todos esos errores ortográficos en mis respuestas: p –
- 1. Sizeof Puntero al array
- 2. sizeof array clarification
- 3. ¿Cómo funciona sizeof? ¿Cómo puedo escribir el mío?
- 4. ¿Cómo funciona la función sizeof() para Estructuras en C?
- 5. sizeof (int) == sizeof (void *)?
- 6. uso de operador sizeof
- 7. La impresión simple con sizeof no funciona en absoluto
- 8. Javascript Array Concat no funciona. ¿Por qué?
- 9. ¿Por qué no funciona `{} .toString.apply (array)`?
- 10. java array pass by reference no funciona?
- 11. ¿Cómo funciona Array # sort cuando se pasa un bloque?
- 12. ¿Cómo funciona Ruby's Array? comparar elementos para la igualdad?
- 13. ¿Cuál es el tamaño de (main), sizeof (printf), sizeof (scanf)?
- 14. ¿Por qué sizeof (int) es diferente de sizeof (int *)?
- 15. sizeof java object
- 16. sizeof a struct member
- 17. C char * sizeof gama
- 18. C# sizeof decimal?
- 19. Sizeof struct in Go
- 20. ¿Por qué sizeof (param_array) es el tamaño del puntero?
- 21. C sizeof una matriz pasada
- 22. sizeof plantilla variadic (suma de sizeof de todos los elementos)
- 23. C - int sizeof gama siempre devuelve 4
- 24. Cómo combinar static_assert con sizeof y stringify?
- 25. sizeof() un vector
- 26. cadena literal Sizeof
- 27. C++ sizeof con bool
- 28. Sizeof vs STRLEN
- 29. ¿Está definido sizeof (bool)?
- 30. sizeof (int) en x64?
¡lol! Eso me enseñará a no verificar que ponga mis manos en el lugar correcto ...gracias por la solución Rob –
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
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 ;-) –