ProgramaciónDesarrollador Backend C

¿Cómo funciona el operador sizeof en el lenguaje C y qué trampas existen al usarlo?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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.
  • Para arreglos, sizeof(array) devuelve el tamaño de todo el arreglo, no del puntero.
  • Al pasar un arreglo a una función, se pierde la información sobre su tamaño.

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)

Pregunta engañosa

¿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

Ejemplos de errores reales debido a la falta de conocimiento sobre los matices del tema


Historia

En el proyecto, se asignó memoria para copiar una cadena de la siguiente manera: 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

Uno de los módulos utilizó 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.