¿Existen limitaciones de tamaño para las estructuras C?

4 minutos de lectura

¿Existen limitaciones de tamano para las estructuras C
Nemo

¿Existen limitaciones de tamaño para las estructuras C?

  • ¿Te refieres al tamaño físico en la memoria o al número de miembros?

    – Un tipo programador

    11/10/2011 a las 10:50

  • Tamaño físico en la memoria.

    – Nemo

    11/10/2011 a las 10:51

  • Si tiene esta consideración, ¿tal vez usar una estructura es la forma incorrecta?

    – AndersK

    11 de octubre de 2011 a las 10:58

  • sí, tamaño físico en la memoria.

    – Scott.N

    22 de marzo de 2013 a las 10:15

1647681485 977 ¿Existen limitaciones de tamano para las estructuras C
alexey frunze

Del estándar C:

5.2.4.1 Límites de traducción

1 La implementación deberá poder traducir y ejecutar al menos un programa que contenga al menos una instancia de cada uno de los siguientes límites:

… — 65535 bytes en un objeto (solo en un entorno alojado)
… — 1023 miembros en una sola estructura o sindicato
… — 63 niveles de estructura anidada o definiciones de unión en una sola lista de declaración de estructura … 13) Las implementaciones deben evitar imponer límites de traducción fijos siempre que sea posible.

Aparte de eso, el límite superior es SIZE_MAX (valor máximo para size_t).

1647681485 479 ¿Existen limitaciones de tamano para las estructuras C
Blagovest Büyükliev

Desde el sizeof operador produce un resultado de tipo size_tel límite debe ser SIZE_MAX.

Puede determinar el valor de SIZE_MAX Me gusta esto:

#include <stdint.h>
#include <stdio.h>

int main (void) {
  printf("%zu", SIZE_MAX);
  return 0;
}

Esto es lo que el compilador debería permitir. Lo que permite el entorno de tiempo de ejecución es otra historia.

Declarar un objeto de tamaño similar en la pila (localmente) en la práctica no funcionará ya que la pila es probablemente mucho, mucho más pequeña que SIZE_MAX.

Tener un objeto de este tipo globalmente podría hacer que el cargador ejecutable se queje al iniciar el programa.

  • ¿Puede decir cuál es el valor probable de SIZE_MAX? ¿Es dependiente del sistema operativo? quiero saber el valor exacto.

    – Nemo

    11 de octubre de 2011 a las 10:54

  • Tengo mucha curiosidad sobre qué tamaño quieres usar y por qué. ¿Dinos?

    – José

    11/10/2011 a las 10:55

  • Al menos en teoría. En la práctica, el límite es la memoria de la computadora, que es mucho más pequeña que SIZE_MAX en una computadora moderna de 64 bits.

    – Un tipo programador

    11 de octubre de 2011 a las 10:57

  • @Nemo Verifique el archivo de encabezado stdint.h, debería estar allí.

    – Un tipo programador

    11 de octubre de 2011 a las 10:57

  • @Nemo: SIZE_MAX depende del compilador/arquitectura, lo que significa que también depende del sistema operativo, en términos generales. Consulte su definición en stdint.h (o, si no está allí, posiblemente en limits.h) en los archivos de encabezado de su compilador.

    – Alexei Frunze

    11 de octubre de 2011 a las 11:02

Análisis empírico

En la práctica, las implementaciones como GCC parecen permitir solo estructuras más pequeñas que size_ttal vez obligado por PTRDIFF_MAX. Ver también: ¿Cuál es el tamaño máximo de una matriz en C?

Utilizando:

 for i in `seq 32`; do printf "typedef struct { S$i x; S$i y; } S$(($i+1));\n"; done

Hacemos el programa:

#include <stdint.h>
#include <stdio.h>

typedef struct { uint8_t i; } S0;
typedef struct { S0 x; S0 y; } S1;
typedef struct { S1 x; S1 y; } S2;
typedef struct { S2 x; S2 y; } S3;
typedef struct { S3 x; S3 y; } S4;
typedef struct { S4 x; S4 y; } S5;
typedef struct { S5 x; S5 y; } S6;
typedef struct { S6 x; S6 y; } S7;
typedef struct { S7 x; S7 y; } S8;
typedef struct { S8 x; S8 y; } S9;
typedef struct { S9 x; S9 y; } S10;
typedef struct { S10 x; S10 y; } S11;
typedef struct { S11 x; S11 y; } S12;
typedef struct { S12 x; S12 y; } S13;
typedef struct { S13 x; S13 y; } S14;
typedef struct { S14 x; S14 y; } S15;
typedef struct { S15 x; S15 y; } S16;
typedef struct { S16 x; S16 y; } S17;
typedef struct { S17 x; S17 y; } S18;
typedef struct { S18 x; S18 y; } S19;
typedef struct { S19 x; S19 y; } S20;
typedef struct { S20 x; S20 y; } S21;
typedef struct { S21 x; S21 y; } S22;
typedef struct { S22 x; S22 y; } S23;
typedef struct { S23 x; S23 y; } S24;
typedef struct { S24 x; S24 y; } S25;
typedef struct { S25 x; S25 y; } S26;
typedef struct { S26 x; S26 y; } S27;
typedef struct { S27 x; S27 y; } S28;
typedef struct { S28 x; S28 y; } S29;
typedef struct { S29 x; S29 y; } S30;
/*typedef struct { S30 x; S30 y; } S31;*/
S30 s;

int main(void) {
    printf("%jx\n", (uintmax_t)sizeof(s));
    return 0;
}

y luego en Ubunbu 17.10:

$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ arm-linux-gnueabi-gcc -std=c99 main.c

obras. Pero si descomentamos S31falla con:

main.c:35:16: error: type ‘struct <anonymous>’ is too large
typedef struct { S30 x; S30 y; } S31;

Entonces, el tamaño máximo está entre 2^30 y (2^31 – 1).

Entonces podemos convertir S30 para:

typedef struct { S29 x; S29 y; uint8_t a[(2lu << 29) - 1]; } S30;

y con eso determinamos que el tamaño máximo es en realidad 2^31 - 1 == PTRDIFF_MAX sobre esta implementación.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad