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;
}
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;
}
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.14159
un 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.
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
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:
#define
en lugar de const
enum { sz = 12 };
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
.
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ícitamenteconstexpr
si tienen unconstexpr
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