2013-03-23 15 views
5

Come posso dichiarare due variabili diverse (ad esempio xey) che hanno lo stesso indirizzo?Lo stesso indirizzo di due variabili?

printf("%p\n",&x); /*will be same */ 
    printf("%p\n",&y); 

Se possibile senza union?

+1

Con un sindacato? .. – Mysticial

+0

e non vuoi puntatori? – Alon

+0

Sì. è un modo, ma voglio senza usare il sindacato. – Farseer

risposta

7

L'esatta richiesta non può essere eseguita utilizzando solo le funzionalità standard della lingua, ma alcuni compilatori hanno estensioni che lo consentono. Ad esempio, con GCC questo potrebbe fare ciò che vuoi (documentation here).

#define ASMNAME(x) ASMNAME_(__USER_LABEL_PREFIX__, #x) 
#define ASMNAME_(x,y) ASMNAME__(x, y) 
#define ASMNAME__(x,y) __asm__(#x y) 
int x; 
extern int y ASMNAME(x); 

int main(void) 
{ 
    return !(&x == &y); /* will exit successfully */ 
} 

Nota bene l'effetto che questo ha, però: nel file oggetto, c'è una sola variabile, e il suo nome è x. è stato dichiarato come un altro nome nel codice sorgente. Questo può o non può essere abbastanza buono a seconda di ciò che stai cercando di fare.

Si noti inoltre che le due variabili sono considerate come distinte per scopi di ottimizzazione. Per esempio:

#define ASMNAME(x) ASMNAME_(__USER_LABEL_PREFIX__, #x) 
#define ASMNAME_(x,y) ASMNAME__(x, y) 
#define ASMNAME__(x,y) __asm__(#x y) 
int x; 
extern int y ASMNAME(x); 

#include <stdio.h> 

int main(void) 
{ 
    int a, b; 
    x = 1; 
    a = x; 
    y = 2; 
    b = x; 
    printf("a=%d b=%d x=%d y=%d\n", a, b, x, y); 
    return 0; 
} 

può ben stampare

a=1 b=1 x=1 y=2 

perché il negozio a y non è considerato per influenzare il valore di x.

+0

Buona idea, grazie per la risposta! – Farseer

+0

@Fracciatore Si prega di leggere la risposta modificata e assicurarsi che ciò faccia realmente ciò che si desidera. – zwol

+0

Lo fa. Grazie mille, Zack! – Farseer

4

Non c'è modo di fare ciò che si vuole in puro C, quando si dichiarano variabili (e si fa qualcosa che leggerà/scriverà i loro indirizzi [in modo che il compilatore non possa decidere di trattarli come registri]) essi sono stanza assegnata in memoria. Non si può avere 2 variabili occupano lo stesso spazio senza riferimenti glorificati di CPP o un sindacato, si può avere una variabile e una serie di indicazioni per esso, però:

type1 var1; 
type2 * var2 = &var1; 

Ma alla fine quando voglio per il trattamento di un pezzo di la memoria, come i diversi tipi di solito solo fare:

void * var = &something; 

E poi basta utilizzarlo come:

*(int*)var 
1
int *p=NULL; 
    *p=value1; , 

stampalo *p=value2;, usalo

+0

e ottieni l'eccezione? – Alon

+0

quale eccezione? – XTGX

+0

@XTG non si assegna memoria per '* p' quindi l'assegnazione a' * p' è comportamento non definito. e può causare seg-fault. –

6

Che cosa dice @Mysticial è corretto. Gli elementi dell'Unione condividono lo spazio di memoria. e due variabili in unione hanno lo stesso indirizzo iniziale. di seguito è riportato il mio esempio di programma e il suo output può aiutarti a capire.

#include<stdio.h> 
union u{ 
int x; 
int y; 
}; 
union u a; 
int main(){ 
    printf("\n %p %p\n",&a.x, &a.y); 
    return 1; 
} 

uscita:

~$ ./a.out 

0x601030 0x601030 

Inoltre, come @Alon idea, in C++ si dispone di un altro tipo di variabile di riferimento variabile chiamata è alias di altra variabile. è possibile creare come: (si domanda è Taged C, In C non si dispone di variabili di riferimento) vedere sotto:

int a = 10; 
int &b = a; 

+----+----+ 
| 10 | <--- a = b 
+----+----+ 
    2002   

se si stampa &a e &b quindi si otterrà 2002 stesso.

+0

Grazie per la risposta, ma è possibile senza Unione? – Farseer

+0

È vero, ma xey non sono due variabili diverse: l'unione è la variabile. – teppic

+0

Non in C. In C++ si potrebbe fare con riferimenti. In C, una variabile è per definizione un indirizzo univoco. –

Problemi correlati