2009-07-30 12 views
11

Penso di aver letto da qualche parte che è illegale prendere l'indirizzo di un valore enum in C (i valori enum non sono lvalue, tuttavia, non riesco a trovare alcuna informazione su questo ora). È corretto e, in tal caso, perché?Posizione memoria del valore enum in C


Edit:

Ecco un esempio che chiarisca cosa intendo per "valore enum" di cui sopra. Voglio dire prendere l'indirizzo del first_value di seguito, non prendere l'indirizzo di un caso reale di un enum:

enum myenum 
{ 
    first_value, 
    second_value 
}; 
+0

Questo enum esiste solo nella memoria del compilatore, non dell'eseguibile. Dovrai creare un'istanza dell'enumerazione affinché appaia nell'eseguibile. – Anonym

risposta

24

"Valore di enumerazione" è leggermente ambiguo; tuttavia, suppongo che voi dire quanto segue:

enum myenum 
{ 
    first_value, 
    second_value 
}; 

In questo caso, è illegale prendere l'indirizzo di first_value. La ragione di ciò è che first_value non esiste effettivamente in memoria da nessuna parte ... è solo una costante, effettivamente un altro nome per il numero 0 (di cui, ovviamente, non puoi prendere l'indirizzo).

Se, d'altra parte, è dire se è possibile prendere l'indirizzo di una variabile che viene dichiarata come un enum:

enum myenum x; 
enum myenum *mypointer=&x; 

allora che è sicuramente possibile.

+1

Perché il downvote? –

+2

Ognuno ne ha uno - una parte della meraviglia di SO, immagino. –

+0

Grazie! Sì, era ambiguo. Ho chiarito la domanda con il primo esempio della tua risposta. – olovb

18

se si dispone di:

enum E { 
    X, Y, Z 
}; 

allora non può prendere gli indirizzi di X, Y o Z, non più di quanto si può prendere gli indirizzi di 0, 1 o 2.

Tuttavia, si può prendere l'indirizzo di un'istanza enum:

typedef enum { 
    X, Y, Z 
} E; 

int main() { 
    E e; 
    E * ep; 
    ep = & e; 
} 
5

I nomi dei valori per le enumerazioni sono solo alias costanti per gli interi, quindi non ha senso cercare di prendere il loro indirizzo. È possibile prendere l'indirizzo di una variabile enum bene, ovviamente.

+0

I valori enum sono costanti, ma non sono macro. Per molti aspetti, ovviamente funzionano in modo simile alle costanti definite usando le macro, ma sono diverse in alcuni modi sottili - sono soggette ad ambito, ad esempio, mentre i macro no. –

+0

Non sono certamente #defini o macro. Potresti voler riformulare questo. –

+0

Sì, Gesù, ho decisamente sottovalutato la pedanteria che avrei incontrato. Mea maxima effing culpa. Tutto meglio ora. – chaos

0

Per quanto ricordo le enumerazioni in C sono solo numeri interi. Quindi sarebbe come puntare alla variabile locale.

+1

Un puntatore a una variabile locale è una cosa perfettamente valido in C. –

+0

È vero, è da molto tempo che ho usato C. Ci sono dei momenti in cui mi sento come se non so ancora qualcosa, proprio come un PM che era un programmatore 10 anni fa ... dovrei votare per me stesso –

10

Enums sono utilizzati per sostituire #define catene:

#define SUCCESS 0 
#define LITTLE_ERROR 1 
#define BIG_ERROR 2 

Questo può essere sostituito con:

enum 
{ 
    SUCCESS, 
    LITTLE_ERROR, 
    BIG_ERROR 
}; 

un valore di enumerazione come SUCCESS è solo un simbolo per un intero costante, che ha vinto' essere memorizzati in qualsiasi punto della memoria del programma. Quindi non ha senso prendere il suo indirizzo.

2

i pls si riferiscono l'esempio seguente:

enum { FIRST,SECOND } var; 

qui il FIRST e SECOND sono le macro costanti.Quindi l'operatore & non funzionerà, dal momento che non è memorizzato da nessuna parte nella memoria

Ma per var verrà assegnata una posizione di memoria e sarà possibile utilizzare l'operatore &.