![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrati | Regole Forum | Collegamenti | Album | FAQ | Members List | Calendario | Ricerca | Today's Posts | Mark Forums Read |
| Di programmazione ad alto livello Pubblica domande su C, C + +, Java, SQL, e di altri linguaggi di programmazione qui. |
Più di UNIX e Linux Forum Argomenti potreste trovare utili
|
||||
| Filo | Thread Starter | Forum | Risposte | Ultimo Post |
| sarà questo script crontab in vigore domenica 9? | thepurple | SUN Solaris | 2 | 10-05-2007 05:31 AM |
| Disattivare temporaneamente l'effetto di set-e in ksh | ugeek | Shell scripting e di programmazione | 1 | 03-28-2007 05:21 AM |
| Come effetto script di proprietà? | Chiefos | UNIX for Dummies Domande & Risposte | 1 | 06-21-2006 07:23 AM |
| Effetto del kernel preemptive | sriram.ec | UNIX e avanzata per utenti esperti | 2 | 03-15-2006 01:43 AM |
| ricorsive effetto! | sskb | UNIX for Dummies Domande & Risposte | 2 | 01-30-2003 12:05 PM |
![]() |
|
|
LinkBack | Thread Tools | Cerca in questo Thread |
Rating:
|
Modalità di visualizzazione |
|
|
|
||||
|
strano effetto: se ... altro in C influenza di una precedente dichiarazione
Scrivere un breve codice in C
può funzionare bene, ma quando aggiungere un se ... altro ... struttura, una prima struttura di calcolo non può dare un risultato corretto compilazione e la gestione possono fare bene, ma il risultato è sbagliato. Molto strano (1) y2 \u003d espressione; / / y2 \u003d 0 sempre 0 errore ................. aggiungere: se (a-> is_root, lettera c) \u003d m2 - y2; else f \u003d m2 - y2; (2) y2 \u003d espressione; / / y2 \u003d 0 sempre 0 errore ................. aggiungere: se (a-> is_root, lettera c) \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (3) y2 \u003d espressione; / / y2 \u003d valore normale, normale ................. aggiungere: / / if (a-> is_root, lettera c) \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (4) y2 \u003d espressione; / / y2 \u003d valore normale, normale ................. aggiungere: se (a-> is_root, lettera c) \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; (5) y2 \u003d espressione; / / y2 \u003d valore normale, normale aggiungere: / / if (a-> is_root, lettera c) \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; Problemi: non può essere utilizzato se ... altro ... normalmente Domanda: (1), se ... altro ... possono influenzare una precedente dichiarazione, perché? (2) Come risolvere il problema? Ultimo a cura di cdbug; al 11/20/2008 05:38 AM.. |
|
||||
|
Questo accade in una grande funzione, che ha un algoritmo relativamente complicato.
Basta parlare, la sua struttura è in quanto tale: ___________________________________________________________ alcune conoscenze di base di calcolo ------------------------------ y \u003d espressione; ------------------------------- ____________________________________________________________ alcune operazioni -------------------------------- -------------------------------- se ( blocco 1; ) else ( se (blocco 2;) else (blocco 3;) ) La struttura dei blocchi 2 e 3, cambierà il modo in cui y è calcolato. Il risultato è sbagliato. Verificare attraverso gdb. I cinque risultati di cui sopra sono disponibili presso lo stesso ambiente, ad eccezione per le modifiche in due blocchi In molte esecuzioni, y è sempre uguale a 0. In caso contrario, sarà molto più grande di un valore giusto. Ma quando uno o di ciascuno dei due blocchi è stato rimosso, e si ottiene un valore normale. Non riesco a capire |
|
||||
|
L'unica situazione possibile è che block2 o block3 sono traboccante di una variabile sulla funzione della pila e la tua y var è cambiato. Una funzione della pila è composta (in crescita dal basso di memoria ad alta memoria) da variabili (in ordine inverso), EIP, esp, Nome di funzione e esp. Ecco un semplice esempio per la tua situazione possibile: Codice:
void of()
{
char a[10];
char b[10];
strcpy (a, "aaaaaaaaaa");
printf ("%s\n", a);
strcpy(b, "bbbbbbbbbboverflow");
printf ("%s\n", a);
}
void
main ()
{
of();
}
Come si sarà in grado di vedere, variabile b overflow in variabile a. |
|
||||
|
L'errata valore è assegnato ad eseguire quando y 'y \u003d espressione;'
in gdb, 'py' darà il valore errato runing dopo la dichiarazione di cui sopra. ma 'p espressione' dà il giusto valore. block2 e block3 sono come questo: if (a-> is_root, lettera c) \u003d m2 - y2; else f \u003d m2 - y2; Come detto in precedenza: una sola dichiarazione: se (a-> is_root, lettera c) \u003d m2 - y2; / / y2 normale una sola dichiarazione: if (! a-> is_root) f \u003d m2 - y2; / / y2 normale ma: if (a-> is_root, lettera c) \u003d m2 - y2; else f \u003d m2 - y2; o if (a-> is_root, lettera c) \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; y2 fare entrambe le anomalie. 'y2 \u003d espressione' è lontano da if__ altro __ struttura Grazie per il tuo insegnamento Ultimo a cura di cdbug; al 11/23/2008 04:28 AM.. |
![]() |
| Segnalibri |
| Thread Tools | Cerca in questo Thread |
| Modalità di visualizzazione | Vota questo thread |
|
|