2011-09-08 5 views
12

Se memorizzo un puntatore a una funzione, e in un secondo momento durante l'esecuzione del mio programma, lo confronta con l'indirizzo della stessa funzione, i due indirizzi sono garantiti uguali.Le funzioni C hanno un indirizzo di memoria fisso?

E.g.

int foo(void){return 0;} 
int (*foo_p)(void) = &foo; 

assert(foo_p == &foo); 

Nel codice sopra è l'affermazione sempre garantito per avere successo? Ci sono qualsiasi circostanze in cui l'indirizzo di una funzione può cambiare?

risposta

17

Per 6.5.9:

Due puntatori confronta uguali se e solo se entrambi sono puntatori nulli, entrambi sono puntatori alla stessa oggetto (compreso un puntatore ad un oggetto e un oggetto secondario al suo inizio) o funzione, entrambi puntatori a un passato l'ultimo elemento dello stesso oggetto matrice o uno è un puntatore a uno passato alla fine di un oggetto matrice e l'altro è un puntatore all'inizio di un diverso oggetto matrice che succede di seguire immediatamente il primo oggetto dell'array nello spazio degli indirizzi.

(grassetto aggiunto per enfasi.)

0

l'indirizzo di una funzione non cambierà mai. Molti programmi sono costruiti attorno al concetto di callback, che non funzionerebbe se l'indirizzo di una funzione potesse cambiare.

Se, ipoteticamente, la posizione di una funzione viene modificata, ad esempio da un programma auto-modificante, tutte le chiamate a tale funzione causerebbero un comportamento segfault o molto indefinito in qualsiasi modo. Modifica: Chiarificazione - i simboli di funzione sono come puntatori, se la memoria di free puntata da un puntatore, che non azzererà la variabile puntatore effettiva, continuerà a puntare lì, proprio come le chiamate di funzione puntano ancora alla vecchia posizione del mosso funzione.

I programmi auto-modificanti sono eccezioni molto grandi però, e in questi giorni la sezione di codice di un file binario è protetta da scrittura che lo rende molto, molto difficile.