2011-11-23 6 views
5

So che in C, gli array non dovrebbero essere dimensionati dinamicamente.È possibile utilizzare sizeof() per definire una lunghezza dell'array?

Con questo in mente, sarebbe consentito il seguente codice? (Cercando di dichiarare un array di caratteri della stessa lunghezza come una doppia.)

char bytes[sizeof(double)]; 

mia ipotesi è che sizeof opera su suo argomento durante l'esecuzione del programma e quindi questo non sarebbe consentito, ma non sono sicuro .

Inoltre, sarebbe una differenza se questo fosse C++ anziché C?

risposta

7

La dimensione dell'espressione viene valutata in fase di compilazione (dal compilatore non dal preprocessore), quindi l'espressione è legale.

Esiste un'eccezione a questa regola in C99 in cui sono consentiti gli array dinamici. In questo caso sizeof è, a seconda del contesto, valutato in fase di esecuzione (http://en.wikipedia.org/wiki/Sizeof). Non cambia la legalità dell'espressione nella domanda.

1

Sì, è perfettamente bene farlo. Il valore di sizeof() è determinato al momento della compilazione.

6

Sì, può e non sarà nemmeno una dimensione dinamica, perché sizeof(double) è una costante in fase di compilazione.

1

A condizione che l'operando non sia un VLA, è possibile utilizzare sizeof come contant reale.

#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; 
} 

Vedere codice "corsa" alla http://ideone.com/95bwM