Namespaces
Variants

sizeof operator

From cppreference.net

Consulta el tamaño del objeto o tipo.

Se utiliza cuando se debe conocer el tamaño real del objeto.

Contenidos

Sintaxis

sizeof( type ) (1)
sizeof expression (2)

Ambas versiones devuelven un valor de tipo size_t .

Explicación

1) Devuelve el tamaño, en bytes, de la representación del objeto de type
2) Devuelve el tamaño, en bytes, de la representación del objeto del tipo de expression . No se aplican conversiones implícitas a expression .

Notas

Dependiendo de la arquitectura del computador, un byte puede consistir de 8 o más bits, el número exacto proporcionado como CHAR_BIT .

sizeof ( char ) , sizeof ( signed char ) y sizeof ( unsigned char ) siempre devuelven 1 .

sizeof no se puede utilizar con tipos de función, tipos incompletos (incluyendo void ), o bit-field lvalues.

Cuando se aplica a un operando que tiene tipo estructura o unión , el resultado es el número total de bytes en dicho objeto, incluyendo el relleno interno y final. El relleno final es tal que si el objeto fuera un elemento de un arreglo, se satisfaría el requisito de alineación del siguiente elemento de este arreglo, en otras palabras, sizeof ( T ) devuelve el tamaño de un elemento de un arreglo T [ ] .

Si type es un tipo VLA y modificar el valor de su expresión de tamaño no afectaría el resultado de sizeof , no está especificado si la expresión de tamaño es evaluada o no.

(desde C99)

Excepto si el tipo de expression es un VLA , (desde C99) expression no se evalúa y el operador sizeof puede usarse en una expresión constante entera.

Si el tipo de expression es un arreglo de longitud variable , expression es evaluada y el tamaño del arreglo al que evalúa es calculado en tiempo de ejecución.

(desde C99)

El número de elementos en cualquier array a incluyendo VLA (since C99) puede determinarse con la expresión sizeof a / sizeof a [ 0 ] . Nótese que si a tiene tipo puntero (como después de la conversión de array a puntero o el ajuste de tipo de parámetro de función), esta expresión simplemente dividiría el número de bytes en un tipo puntero por el número de bytes en el tipo apuntado.

Palabras clave

sizeof

Ejemplo

La salida de ejemplo corresponde a una plataforma con punteros de 64 bits e int de 32 bits

#include <stdio.h>
int main(void)
{
    short x;
    // type argument:
    printf("sizeof(float)          = %zu\n", sizeof(float));
    printf("sizeof(void(*)(void))  = %zu\n", sizeof(void(*)(void)));
    printf("sizeof(char[10])       = %zu\n", sizeof(char[10]));
//  printf("sizeof(void(void))     = %zu\n", sizeof(void(void))); // Error: function type
//  printf("sizeof(char[])         = %zu\n", sizeof(char[])); // Error: incomplete type
    // expression argument:
    printf("sizeof 'a'             = %zu\n", sizeof 'a'); // type of 'a' is int
//  printf("sizeof main            = %zu\n", sizeof main); // Error: Function type
    printf("sizeof &main           = %zu\n", sizeof &main);
    printf("sizeof \"hello\"         = %zu\n", sizeof "hello"); // type is char[6]
    printf("sizeof x               = %zu\n", sizeof x); // type of x is short
    printf("sizeof (x+1)           = %zu\n", sizeof(x + 1)); // type of x+1 is int
}

Salida posible:

sizeof(float)          = 4
sizeof(void(*)(void))  = 8
sizeof(char[10])       = 10
sizeof 'a'             = 4
sizeof &main           = 8
sizeof "hello"         = 6
sizeof x               = 2
sizeof (x+1)           = 4

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 6.5.3.4 Los operadores sizeof y alignof (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.5.3.4 Los operadores sizeof y _Alignof (p: TBD)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.5.3.4 Los operadores sizeof y _Alignof (p: 90-91)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.5.3.4 El operador sizeof (p: 80-81)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.3.3.4 El operador sizeof

Véase también

Documentación de C++ para sizeof operator