En el compilador gcc, sizeof(main)
, sizeof(printf)
y sizeof(scanf)
todos son 1. Quiero saber cómo el tamaño de todos estos son 1. ¿Cuál es la lógica detrás de esto?¿Cuál es el tamaño de (main), sizeof (printf), sizeof (scanf)?
Respuesta
Debido a que el C (99) estándar requiere (§ 6.5.3.4/1)
sizeof
El operador no se aplicarán a una expresión que tiene el tipo de función o un tipo incompleto, al nombre entre paréntesis de dicho tipo, o a una expresión que designa un miembro de campo de bit.
por lo que el valor de retorno no tiene sentido. Si necesita el sizeof
el puntero de función, utilice
sizeof(&main)
sizeof(&printf)
sizeof(&scanf)
vuelve gcc 1 sobre los tipos que el sizeof no tiene sentido (ver c-common.c):
4187 if (type_code == FUNCTION_TYPE)
4188 {
4189 if (is_sizeof)
4190 {
4191 if (complain && (pedantic || warn_pointer_arith))
4192 pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4193 "invalid application of %<sizeof%> to a function type");
4194 else if (!complain)
4195 return error_mark_node;
4196 value = size_one_node;
4197 }
4198 else
4199 value = size_int (FUNCTION_BOUNDARY/BITS_PER_UNIT);
4200 }
4201 else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
4202 {
4203 if (type_code == VOID_TYPE
4204 && complain && (pedantic || warn_pointer_arith))
4205 pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4206 "invalid application of %qs to a void type", op_name);
4207 else if (!complain)
4208 return error_mark_node;
4209 value = size_one_node;
4210 }
Entonces, ¿aplicar sizeof a un tipo de función es un comportamiento indefinido/no especificado? – codymanix
thnx KennyTM ... Pero quiero saber cómo el compilador gcc devuelve 1 ?? – Parikshita
@Parixit: Porque hiciste algo que no tiene sentido, entonces obtienes un resultado que no tiene sentido. Basura dentro basura fuera. Es un comportamiento indefinido, y el compilador puede hacer lo que quiera, incluso formatear su disco duro o prenderle fuego. Pero optó por hacer algo un poco menos dramático, y acaba de regresar 1 – jalf
Hubiera pensado que era del tamaño de un puntero para funcionar. Una realidad que me sorprende ...
Eso debería ser un comentario, no es realmente una respuesta. –
en lugar de respaldar este comentario, la gente debería rechazar la "respuesta" en su lugar. – codymanix
¿Qué pasa con los comentarios? Encuentro que una de las cosas más útiles de la historia es discutir, con otros desarrolladores, qué pensaban. Eliminar eso es, en mi humilde opinión, locura. –
- 1. sizeof (int) == sizeof (void *)?
- 2. ¿Por qué sizeof (int) es diferente de sizeof (int *)?
- 3. ¿Por qué sizeof (param_array) es el tamaño del puntero?
- 4. uso de operador sizeof
- 5. ¿cuál es el mecanismo de sizeof() en C/C++?
- 6. Sizeof vs STRLEN
- 7. operador sizeof() en C
- 8. sizeof() std :: vector (C++)
- 9. C sizeof una matriz pasada
- 10. sizeof plantilla variadic (suma de sizeof de todos los elementos)
- 11. C2070 - operando sizeof ilegal
- 12. sizeof() un vector
- 13. sizeof array clarification
- 14. C# sizeof decimal?
- 15. ¿Cómo funciona sizeof (Array)
- 16. sizeof java object
- 17. sizeof a struct member
- 18. Sizeof struct in Go
- 19. Comportamiento del operador sizeof en C
- 20. C++ sizeof con bool
- 21. sizeof() en la memoria malloc'd
- 22. ¿Cómo sabe sizeof el tamaño de la matriz de operandos?
- 23. ¿Qué hace sizeof?
- 24. cadena literal Sizeof
- 25. sizeof para una matriz de caracteres
- 26. Operador sizeof C/C++: ¿Por qué sizeof ('a') devuelve valores diferentes?
- 27. ¿por qué sizeof ('a') es 4 en C?
- 28. sizeof (int) en x64?
- 29. C char * sizeof gama
- 30. ¿Está definido sizeof (bool)?
duplicado: [lo que hace sizeof (nombre de la función) return?] (http://stackoverflow.com/questions/2666392/what-does-sizeof-function-name-return) –