Domanda

void problem3(void) {
    int overflowme[16];
    int x = (int) problem3; // x is the address of the first instr for problem3
    printf("hello world\n");
    overflowme[17] = x; 

Mi chiedo che cosa fa (int) fare in C programmazione.

È stato utile?

Soluzione

E 'un typecast, e dice al compilatore "Ignora il tipo che problem3 ha davvero, e trattare con esso come se fosse stato digitato come un int".

In questo esempio, problem3 ha un tipo puntatore a funzione, così normalmente il compilatore respingere il programma (usando un puntatore a funzione quando è previsto un numero intero è normalmente un errore programmatore). Il typecast costringe una diversa interpretazione -. Il programmatore si sta muovendo e dire "Io so quello che sto facendo"

Altri suggerimenti

E 'un cast esplicito. Stai casting del valore di problem3 in un intero e poi assegnando tale valore intero di x.

Si noti che questo in realtà non cambia il valore della problem3.

Si tratta di un tipo di cast - e ' una forma di conversione del tipo dell'operando (problem3 nel tuo esempio) con un altro tipo.

In C e in C++ quando un cast di tipo C), l'cast può eseguire una delle numerose cose:

  • non fare nulla, ma cambia il tipo di qualcosa senza cambiare la forma dei dati.Per esempio, quando lanci un puntatore a int.
  • eseguire una conversione come parte dell'operazione di cast.Per esempio, quando il cast di un float a int i dati è in realtà trasformato dal modulo utilizzato per rappresentare i valori in virgola mobile (di solito un esponente/mantissa forma) un vecchio pianura intero (con l'eventuale parte frazionaria perso)

Perché le diverse forme di colata può essere fonte di confusione o chiaro ciò che accade (o dovrebbe avvenire), C++ aggiunto alcune specifiche casting operatori:

  • reinterpret_cast<>() che corrisponde alla prima forma descritta sopra
  • static_cast<>() che corrisponde al secondo modulo (anche se la conversione non si tradurrà in un cambiamento dei dati interni formato)
  • const_cast<>() che è un caso speciale di lancio che è in grado di rimuovere il const o volatile qualificatori che potrebbe essere applicato a un oggetto
  • dynamic_cast<>() che è del tutto nuovo per C++ e non ha funzionalità simili a C.Questo operatore è utilizzato in modo sicuro 'abbattuto' un oggetto di base di tipo a uno dei suoi tipi derivati.

Perché sono intrinsecamente pericolosi, calchi sono generalmente considerato cattiva forma.Quando si esegue un'operazione di cast, si sta sovvertendo il compilatore capacità di eseguire un controllo di tipo.Tuttavia, ci sono momenti in cui potrebbe essere necessario o utile, e vedrete che è spesso usato in C codice.

Nel tuo esempio, problem3 è un puntatore a una funzione, e il cast è 'conversione' l'indirizzo per la funzione int.È quindi la conservazione che l'indirizzo-come-int in un array, ma in realtà un elemento di un array passato la fine dell'array (che è un no-no).Su molte piattaforme che non valido elemento di matrice in cui l'indirizzo di ritorno per la funzione viene memorizzato, quindi cosa succederà quando il problem3() la funzione restituisce, si avrà modo di ritornare a se stesso ed eseguire di nuovo (ad infinitum - specie).

Finirà overflow dello stack in quanto il nuovo, e 'violato' esecuzione di problem3() non hanno una funzione chiamata di inserire un indirizzo di ritorno sullo stack - ti basta cestino quant'altro era in pila prima e return a se stesso, ripetendo il processo fino a quando la pila underflow che probabilmente causerà un processore eccezione.

Come altri hanno notato che questo è solo cast esplicito. Cambia solo tipo di variabile in tipo int.

Ma dal codice che hai postato sembra che questa funzione si sta preparando per un qualche tipo di buffer overflow o qualcosa del genere. Qual è il resto di questa funzione?

E 'un typecast es. converte la variabile / costante nella seguente tipo specificato. Qui, un vuoto (*) (void) tipo viene convertito in un int (cosa le parentesi graffe)

Ciò significa che problem3 viene convertito a int prima di assegnare all'int x

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top