El operador sizeof se utiliza para determinar el tamaño de un tipo u objeto en bytes en el momento de la compilación. A menudo es necesario para asignar memoria, calcular tamaños de estructuras y arreglos.
Ejemplo:
int a; printf("%zu\n", sizeof(a)); // tamaño de la variable a de tipo int printf("%zu\n", sizeof(int)); // tamaño de tipo int
Características:
sizeof devuelve size_t, que siempre es >= 0.sizeof(array) devuelve el tamaño de todo el arreglo, no del puntero.Ejemplo de trampa:
void foo(int arr[]) { printf("%zu\n", sizeof(arr)); // mostrará el tamaño del puntero, ¡no del arreglo! } int arr[10]; foo(arr); // sizeof(arr) == 40 (normalmente), sizeof(arr en el contexto de foo) == 8 (normalmente)
¿Qué devolverá la expresión sizeof('a') en el lenguaje C?
Respuesta: A pesar de que 'a' parece un char, en la expresión sizeof('a') el resultado es igual al tamaño del tipo int, ya que una constante de carácter en C es un int.
Ejemplo:
sizeof('a') // normalmente 4, no 1
Historia
malloc(strlen(str) * sizeof(char)), olvidando el carácter nulo. Esto llevó a la pérdida del último byte y a la aparición de errores al trabajar con funciones de la biblioteca estándar de manipulación de cadenas.Historia
sizeof(arr) en una función, esperando el tamaño de toda la estructura, pero solo obtuvo el tamaño del puntero. Como resultado, se escribieron muy pocos datos en la memoria, lo que causó corrupción del heap.Historia
Un desarrollador decidió usar sizeof('a') para asignar memoria para una letra, esperando 1 byte, pero recibió 4 (o 8), lo que resultó en un uso ineficiente de la memoria y problemas en el código dependiente del tamaño esperado.