![]() |
Hej och välkommen från USA till UNIX och Linux Forum! Tack för ditt besök och gå med i vår globala gemenskapen.
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| High Level Programming Post frågor om C, C + +, Java, SQL och andra programmeringsspråk här. |
Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Senaste Inlägg |
| kommer detta script i crontab effekt söndag 9? | thepurple | Sun Solaris | 2 | 10-05-2007 05:31 |
| Tillfälligt stänga av effekten av set-e i ksh | ugeek | Shell-programmering och Skript | 1 | 03-28-2007 05:21 |
| Hur egenskaper verkan script? | Chiefos | UNIX for Dummies Frågor & Svar | 1 | 06-21-2006 07:23 |
| Effekt av förebyggande Kernel | sriram.ec | UNIX för avancerade & Expertanvändare | 2 | 03-15-2006 01:43 |
| rekursiva effekt! | sskb | UNIX for Dummies Frågor & Svar | 2 | 01-30-2003 12:05 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd |
Omdöme:
|
Visningslägen |
|
|
|
||||
|
konstig effekt: om ... annanstans i C inflytande ett tidigare uttalande
Jag skriver en kort kod i C
kan fungera bra, men när jag lägger till en om ... annars ... struktur, en beräkning innan strukturen kan inte ge ett korrekt resultat sammanställning och köra kan göra bra, men resultatet är fel. Very strange (1) y2 \u003d uttryck; / / y2 \u003d 0 alltid 0 fel ................. add: om (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; (2) y2 \u003d uttryck; / / y2 \u003d 0 alltid 0 fel ................. add: om (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (3) y2 \u003d uttryck; / / y2 \u003d normalt värde, normal ................. add: / / if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (4) y2 \u003d uttryck; / / y2 \u003d normalt värde, normal ................. add: om (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; (5) y2 \u003d uttryck; / / y2 \u003d normalt värde, normal add: / / if (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; Problem: Kan inte använda om ... annars ... normalt Fråga: (1) om ... annars ... kan påverka ett tidigare uttalande, varför? (2) Hur löser jag problemet? Senast redigerad av cdbug; 11-20-2008 at 05:38.. |
|
||||
|
Detta händer i en stor funktion, som har en relativt komplicerad algoritm.
Enkelt uttryckt, är dess struktur som sådan: ___________________________________________________________ vissa grundläggande beräkning ------------------------------ y \u003d uttryck; ------------------------------- ____________________________________________________________ vissa åtgärder -------------------------------- -------------------------------- if ( Block 1; ) else ( if (block 2;) else (block 3;) ) Strukturen för block 2 och 3 kommer att förändra det sätt på vilket y beräknas. Resultatet är fel. Jag kollar igenom gdb. De fem resultat ovan erhålls i samma miljö med undantag för de ändringar i de två blocken I många avrättningar, y är alltid lika med 0. Annars kommer det vara mycket större än ett rätt värde. Men när endera eller vardera av de båda blocken tas bort, y kommer att få ett normalt värde. Jag kan inte förstå |
|
||||
|
Den enda möjliga situation här är att block2 eller block3 svämmar över en variabel på din funktion stack och dina y Var håller på att ändras.
En funktion stack består (allt från hög minne till lågt minne) genom variabler (i omvänd ordning), EIP, esp, Funktion namn och esp. Här är ett enkelt exempel för dina eventuella situation: Kod:
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();
}
|
|
||||
|
Det felaktiga värdet tilldelas y när execute "y \u003d uttryck;"
i gdb, kommer 'py "ge det felaktiga värdet efter Runing ovanstående redovisning. men 'p uttrycket ger rätt värde. block2 och block3 är så här: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; Som sagt: bara ett uttalande om (a-> is_root) c \u003d m2 - y2; / / y2 normal bara ett uttalande: 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; både göra y2 onormal. 'y2 \u003d uttrycket "är långt ifrån if__ annat __ struktur Tack för din undervisning Senast redigerad av cdbug; 11-23-2008 at 04:28.. |