En C, ¿por qué no se puede usar una variable const como inicializador de tamaño de matriz? [duplicate]

3 minutos de lectura

avatar de usuario
Mahmud Tmam

En el siguiente código, const int no se puede usar como un tamaño de matriz:

const int sz = 0;
typedef struct
{
   char s[sz];
} st;

int main()
{
   st obj;
   strcpy(obj.s, "hello world");
   printf("%s", obj.s);
   return 0;
}

  • Debido a que el tamaño de una matriz tiene que ser una constante, y una variable const es una variable const, no una constante, significa que no se puede cambiar

    – Nick apoya a Ucrania

    30 de mayo de 2017 a las 16:54


  • Solo otra deficiencia en el idioma.

    – Patinete

    30 de mayo de 2017 a las 16:54

  • …que se corrigió en C++.

    – Santo Gato Negro

    30 mayo 2017 a las 16:55

  • @Mgetz const las variables integrales se convierten implícitamente constexpr si tienen un constexpr inicializador.

    – Santo Gato Negro

    30 de mayo de 2017 a las 16:58

  • Tienes suerte de que el código no se construya, porque si lo hiciera, tendrías comportamiento indefinido escribir en una matriz de tamaño cero.

    – Un tipo programador

    30 mayo 2017 a las 17:00

En C, un const-la variable calificada no es una expresión constante1. Una expresión constante es algo que se puede evaluar en tiempo de compilación: un literal numérico como 10 o 3.14159un literal de cadena como "Hello"a sizeof expresión, o alguna expresión compuesta de la misma como 10 + sizeof "Hello".

Para declaraciones de matriz en el ámbito del archivo (fuera del cuerpo de cualquier función) o como miembros de struct o union tipos, la dimensión de la matriz deber ser una expresión constante.

Para auto matrices (matrices declaradas dentro del cuerpo de una función que no son static), usted lata use una variable o expresión cuyo valor no se conozca hasta el tiempo de ejecución, pero solo en C99 o posterior.


  1. C++ es diferente en este sentido – en ese lenguaje, un const-variable calificada lo hace cuenta como una expresión constante.

  • No puede afirmarse sin reservas que un const-la variable calificada no es una expresión constante. Aunque el estándar C no requiere un expresión constante para incluir un const-variable calificada, C 2018 6.6 10 dice “Una implementación puede aceptar otras formas de expresiones constantes”. (Y el mismo texto está en C 1999.)

    –Eric Postpischil

    02/10/2018 a las 13:50

  • C también se diferencia de C++ en que 10 no se llama un literal numéricopero un constante entera. Aparte: C literales, cuerda y compuestose pueden tomar sus direcciones, a diferencia de una constante entera.

    – chux – Reincorporar a Monica

    2 oct 2018 a las 14:48


avatar de usuario
sintagma

Esto se debe a que en C const en realidad significa solo lectura. citando C Preguntas frecuentes 1.18 y 1.19:

El calificador const realmente significa “solo lectura”; un objeto así calificado es un objeto de tiempo de ejecución al que (normalmente) no se le puede asignar. Por lo tanto, el valor de un objeto calificado const no es una expresión constante en el sentido completo del término y no se puede usar para dimensiones de matriz, etiquetas de casos y similares. (C es diferente a C++ en este sentido). Cuando necesite una verdadera constante de tiempo de compilación, use un preprocesador #define (o tal vez una enumeración).

Referencias: ISO Sec. 6.4 Secciones de salud y seguridad. 7.11.2, 7.11.3 págs. 226-7

Hay dos formas de afrontarlo:

  1. Utilizar #define en lugar de const
  2. Utilizar enum { sz = 12 };

avatar de usuario
simo-r

De una forma muy sencilla porque el compilador debe conocer la dimensión del arreglo en el momento de la compilación y ya que puede inicializar const variable en tiempo de ejecución no puedes hacerlo. Entonces, el tamaño de las matrices declaradas estáticamente deber ser un expresión constante y un const variable no es. Para expresión constante deberías usar una macro (#define) o enum. Eso es explícitamente para su caso (al alcance del archivo) y si usa un estándar mínimo de c99.

¿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