¿Qué significa struct_type?[1] ¿significar?

3 minutos de lectura

avatar de usuario
Trevor

Encontré un código que obtiene el tamaño de una estructura como esta:

sizeof(struct struct_type[1]);

Probé y devuelve el tamaño de struct_type.

Y

sizeof(struct struct_type[2]);

devuelve el doble del tamaño de la estructura.

Editar:

struct_type es una estructura, no una matriz:

struct struct_type {
    int a;
    int b;
};

Que hace struct_type[1] significa realmente?

  • struct_type es probablemente una matriz de estructuras, sizeof(struct struct_type[1]); obtiene el tamaño del primer elemento en la matriz de estructuras.

    – Flau

    2 de agosto de 2016 a las 11:10


  • @iwin no, no es una matriz, tenga la amabilidad de ver mi actualización

    – Trevor

    2 de agosto de 2016 a las 11:12

  • ¿Cómo se declara una matriz de struct_type? Ahora piense cómo obtiene el tamaño de esa matriz por tipo. Por lo general, esto no es una buena práctica, ya que es mejor tomar el sizeof un objeto, es decir, una variable o desreferenciando un puntero al tipo. De esa forma, su código no se romperá si cambia el tipo del objeto. Otro problema es el uso de una constante entera en el código (también conocido como “número mágico”). Mala práctica, usar un #define (también conocido como macro).

    – demasiado honesto para este sitio

    2 de agosto de 2016 a las 11:17


  • Después int a[5];obtenemos sizeof(int)==4, sizeof(int[5])==20, sizeof(a)==20, sizeof(a[5])==4. ¿Lógico? :-)

    – Armín Rigo

    2 de agosto de 2016 a las 14:18

avatar de usuario
sergi

Recuerda sizeof sintaxis:

sizeof ( typename );

Aquí el nombre de tipo es struct struct_type[N] o en una forma más legible struct struct_type [N] que es una matriz de N objetos de tipo struct struct_type. Como sabe, el tamaño de la matriz es el tamaño de un elemento multiplicado por el número total de elementos.

avatar de usuario
sps

Al igual que:

sizeof(int[1]); // will return the size of 1 int

y

sizeof(int[2]); // will return the size of 2 ints

También lo hace:

sizeof(struct struct_type[1]); // return size of 1 `struct struct_type'

y

sizeof(struct struct_type[2]); // return size of 2 `struct struct_type'

Aquí struct struct_type[1]y struct struct_type[2] simplemente representar arrays de elementos de tipo struct struct_typey sizeof of solo devuelve el tamaño de esas matrices representadas.

  • No, no lo hará. Ni siquiera compilará. No puede tener una declaración en sizeof

    – demasiado honesto para este sitio

    2 de agosto de 2016 a las 11:18


  • @Doddy; No, en absoluto.

    – trucos

    02/08/2016 a las 12:35

  • @Doddy Array se convierte en puntero cuando se pasa como argumento a una función. Esto hace no pasar con sizeof operador. sizeof es un operador, no una función. Si aún tiene dudas, verifíquelo probando en su sistema.

    – sps

    2 de agosto de 2016 a las 12:46


  • @Doddy Está bien; He estado loco durante siglos. 🙂

    – Carreras de ligereza en órbita

    02/08/2016 a las 20:53

  • @Doddy: FWIW, tiendo a estar de acuerdo en que dar ningún ejemplos con sizeof es una mala práctica y lleva a la gente a hacer todo tipo de cosas raras y rotas.

    – Carreras de ligereza en órbita

    02/08/2016 a las 21:29

avatar de usuario
trucos

Para la declaración

int arr[10];

El tamaño de la matriz se puede calcular utilizando arr como operando o int [10]. Ya que sizeof operador produce el tamaño basado en el tipo de operando, tanto sizeof(arr) y sizeof (int [10]) devolverá el tamaño de la matriz arr (por último arr es de tipo int [10]).

C11-§6.5.3.3/2:

El operador sizeof produce el tamaño (en bytes) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. El tamaño se determina a partir del tipo de operando.. El resultado es un número entero. Si el tipo del operando es un tipo de matriz de longitud variable, se evalúa el operando; de lo contrario, el operando no se evalúa y el resultado es una constante entera.

De manera similar, para una matriz de struct struct_type

struct struct_type a[1];

El tamaño se puede calcular ya sea por sizeof (a) o sizeof(struct struct_type[1]).

¿Ha sido útil esta solución?