array - VLAs y efectos secundarios en el operando de sizeof
tamaño array c (1)
Parece que debería pensarlo dos veces antes de publicar, porque me llamó la atención justo después de que lo hice.
Mi comprensión de cómo el sizeof
interacciones con VLA es realmente correcta, como lo confirma la siguiente cita (¡gracias a esto!):
6.5.3.4 Los operadores
sizeof
y_Alignof
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
Eso no es lo que está causando este comportamiento sorprendente (para mí).
(void)sizeof (g(2), arr);
En la subexpresión (g(2), arr)
, el operador de coma desencadena la caída de matriz a puntero de arr
. Por lo tanto, el operando de sizeof
ya no es un VLA, sino un char*
simple char*
, y recae en no evaluar su operando.
Apparently este comportamiento se ha alterado en C ++, donde el operador de coma ya no descompone las matrices.
Sé que sizeof
nunca evalúa su operando, excepto en el caso específico donde dicho operando es un VLA. O, pensé que lo sabía.
void g(int n) {
printf("g(%d)/n", n);
}
int main(void) {
int i = 12;
char arr[i]; // VLA
(void)sizeof *(g(1), &arr); // Prints "g(1)"
(void)sizeof (g(2), arr); // Prints nothing
return 0;
}
Que esta pasando?
Por si acaso, esto se compila con GCC 5.1 en Coliru .