![]() |
Hei og Velkommen fra USA til UNIX og Linux Forums! Takk for besøket og Delta i vårt globale samfunn.
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Rules | Lenker | Album | FAQ | Medlemsliste | Kalender | Søke | Dagens innlegg | Marker forumene som lest |
| High Level Programmering Post spørsmål om C, C + +, Java, SQL og andre programmeringsspråk her. |
Mer UNIX og Linux Forum Emner Du kan finne nyttig
|
||||
| Tråd | Tråd startet | Forum | Svar | Siste innlegg |
| vil dette skriptet i crontab effekt søndag 9? | thepurple | Sun Solaris | 2 | 10-05-2007 04:31 |
| Midlertidig deaktivere effekten av set-e i ksh | ugeek | Shell programmering og Skripting | 1 | 03-28-2007 04:21 |
| Hvordan egenskapene effekt script? | Chiefos | UNIX for Dummies Spørsmål og svar | 1 | 06-21-2006 06:23 |
| Effekt av Preemptive Kernel | sriram.ec | UNIX for Advanced & ekspertbrukere | 2 | 03-15-2006 01:43 |
| Rekursiv effekt! | sskb | UNIX for Dummies Spørsmål og svar | 2 | 01-30-2003 12:05 |
![]() |
|
|
LinkBack | Thread Tools | Søk i denne tråden |
Vurdering:
|
Visningsmoduser |
|
|
|
||||
|
merkelig effekt: hvis ... else in C påvirke en tidligere uttalelse
Jeg skriver en kort kode i C
det kan fungere bra, men når jeg legger til en hvis ... else ... struktur, en beregning før strukturen kan ikke gi et riktig resultat kompilering og løpe kan gjøre det bra, men resultatet er feil. Veldig rart (1) y2 \u003d uttrykk; / y2 \u003d 0 alltid 0-feil ................. add: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; (2) y2 \u003d uttrykk; / y2 \u003d 0 alltid 0-feil ................. add: if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (3) y2 \u003d uttrykk; / y2 \u003d normal verdi; normal ................. add: / / if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (4) y2 \u003d uttrykk; / y2 \u003d normal verdi; normal ................. add: if (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; (5) y2 \u003d uttrykk; / y2 \u003d normal verdi; normal add: / / if (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; Trouble: kan ikke bruke hvis ... else ... normalt Spørsmål: (1) hvis ... else ... kan påvirke en tidligere uttalelse, hvorfor? (2) Hvordan løse problemet? Sist endret av cdbug; 11-20-2008 kl 05:38.. |
|
||||
|
Dette skjer i en stor funksjon, som har en relativt komplisert algoritme.
Bare sett er strukturen som sådan: ___________________________________________________________ noen grunnleggende beregning ------------------------------ y \u003d uttrykk; ------------------------------- ____________________________________________________________ noen operasjoner -------------------------------- -------------------------------- hvis ( blokk 1; ) else ( hvis (blokk 2;) else (block 3;) ) Strukturen av blokkene 2 og 3 vil endre måten y er beregnet. Resultatet er galt. Jeg merker det gjennom gdb. De fem Resultatene ovenfor er hentet på samme miljøet bortsett fra endringene i de to blokkene I mange henrettelser, y er alltid lik 0.. Ellers vil det være langt større enn en riktig verdi. Men da enten eller hver av de to blokkene er fjernet, y vil få en normal verdi. Jeg kan ikke forstå |
|
||||
|
Den eneste mulige Situasjonen her er at block2 eller block3 er overfylte en variabel på funksjon stack og dine y var blir endret.
En funksjon stack er sammensatt (vokser fra høy minne til lite minne) ved variabler (i motsatt rekkefølge), EIP, esp, Funksjon navn og esp. Her er et enkelt eksempel for mulige situasjon: Code:
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();
}
|
|
||||
|
Den forveksles verdien er tildelt y når execute "y \u003d uttrykk;"
i gdb, vil "py" gi feil verdi etter runing ovenstående uttalelse. men 'p uttrykket' gir rett verdi. block2 og block3 er slik: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; Som sagt før: kun én setning: if (a-> is_root) c \u003d m2 - y2; / / y2 normal kun én setning: if (! a-> is_root) f \u003d m2 - y2; / / y2 normal men: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; eller if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; gjør begge Y2 unormal. 'y2 \u003d uttrykket' er langt unna if__ annet __ struktur Takk for undervisning din Sist endret av cdbug; 11-23-2008 kl 04:28.. |
![]() |
| Hugseliste |
| Thread Tools | Søk i denne tråden |
| Visningsmoduser | Ranger denne tråden |
|
|