2011-11-23 20 views
5

Sé que en C, no se supone que las matrices tengan un tamaño dinámico.¿Se puede utilizar sizeof() para definir una longitud de matriz?

Teniendo esto en cuenta, ¿se permitiría el siguiente código? (Tratando de declarar una matriz de caracteres la misma longitud que un doble.)

char bytes[sizeof(double)]; 

Mi conjetura es que sizeof opera sobre su argumento durante la ejecución del programa y para que esto no se permitiría, pero no estoy seguro .

Además, ¿habría alguna diferencia si fuera C++ en lugar de C?

Respuesta

7

El tamaño de expresión se evalúa en tiempo de compilación (por el compilador no por el preprocesador), por lo que la expresión es legal.

Existe una excepción a esta regla en C99 donde se permiten matrices dinámicas. En ese caso, sizeof es, según el contexto, evaluado en tiempo de ejecución (http://en.wikipedia.org/wiki/Sizeof). No cambia la legalidad de la expresión en la pregunta.

1

Sí, está perfectamente bien hacerlo. El valor de sizeof() se determina en tiempo de compilación.

6

Sí, puede y ni siquiera tendrá un tamaño dinámico, porque sizeof(double) es una constante en tiempo de compilación.

1

Si su operando no es un VLA, puede usar sizeof como un contant real.

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    double x; 
    unsigned char dbl[sizeof x];        /* real constant */ 

    /* make x's format have a 1 bit on the "correct" place */ 
    x = 32.000000000000004; 
    memcpy(dbl, &x, sizeof x); 
    switch (dbl[0]) { 
    case sizeof *dbl: puts("1"); break;     /* real constant */ 
    case 0: puts("0"); break; 
    default: puts("other"); 
    } 
    return 0; 
} 

Ver código "corriendo" en http://ideone.com/95bwM

Cuestiones relacionadas