![]() |
|
|
Google unix.com
|
|||||||
| Foren | Registrieren | Forum-Regeln | Links | Alben | FAQ | Benutzerliste | Kalender | Suche | Die heutige Beiträge | Alle Foren als gelesen markieren |
| High-Level-Programmierung Post Fragen zu C, C + +, Java, SQL, und andere Programmiersprachen hier. |
Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
|
||||
| Faden | Thread Starter | Forum | Antworten | Last Post |
| Wird sich dieses Skript in crontab Wirkung So 9? | thepurple | SUN Solaris | 2 | 10-05-2007 05:31 AM |
| Vorübergehend deaktivieren Wirkung von Set-e in ksh | ugeek | Shell Programmierung und Scripting | 1 | 03-28-2007 05:21 AM |
| Wie Eigenschaften Wirkung Skript? | Chiefos | UNIX for Dummies Questions & Answers | 1 | 06-21-2006 07:23 AM |
| Auswirkungen der Preemptive Kernel | sriram.ec | UNIX für Fortgeschrittene und Experten | 2 | 03-15-2006 01:43 AM |
| rekursive Wirkung! | sskb | UNIX for Dummies Questions & Answers | 2 | 01-30-2003 12:05 PM |
![]() |
|
|
LinkBack | Thread Tools | Suche diesen Thread |
Bewertung:
|
Anzeige-Modi |
|
|
|
||||
|
seltsamen Effekt: wenn ... sonst in C Einfluss einer früheren Erklärung
Ich schreibe einen kurzen Code in C
es kann gut funktionieren, aber wenn ich ein, wenn ... else ... Struktur, eine Berechnung vor der Struktur können nicht eine richtige Ergebnis Zusammenstellung und Ausführung kann das gut, aber das Ergebnis ist falsch. Sehr merkwürdig (1) y2 \u003d expression; / / y2 \u003d 0 immer 0 Fehler ................. Hinzufügen: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; (2) y2 \u003d expression; / / y2 \u003d 0 immer 0 Fehler ................. Hinzufügen: if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (3) y2 \u003d expression; / / y2 \u003d Normalwert; normalen ................. hinzufügen: / / if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; (4) y2 \u003d expression; / / y2 \u003d Normalwert; normalen ................. Hinzufügen: if (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; (5) y2 \u003d expression; / / y2 \u003d Normalwert; normalen hinzufügen: / / if (a-> is_root) c \u003d m2 - y2; / / if (! a-> is_root) f \u003d m2 - y2; Trouble: nicht verwenden können, wenn ... else ... normalerweise Frage: (1), wenn ... else ... beeinflussen können, eine frühere Erklärung, warum? (2) Wie um das Problem zu lösen? Zuletzt bearbeitet von cdbug; am 11-20-2008 05:38 AM.. |
|
||||
|
Dies geschieht in einer großen Aufgabe, die einen relativ komplizierten Algorithmus.
Einfach gesprochen, seine Struktur ist als solche: ___________________________________________________________ einige grundlegende Berechnung ------------------------------ y \u003d expression; ------------------------------- ____________________________________________________________ einige Operationen -------------------------------- -------------------------------- if ( Block 1; ) else ( if (Block 2;) else (Block 3;) ) Die Struktur der Blöcke 2 und 3 wird die Art und Weise, wie y berechnet. Das Ergebnis ist falsch. Ich es durch gdb. Die fünf oben genannten Ergebnisse sind erhältlich bei der gleichen Umgebung mit Ausnahme der Änderungen in den beiden Blöcken In vielen Ausführungen, und ist immer gleich auf 0 gesetzt. Andernfalls wird es sehr viel größer als ein Wert. Aber wenn einer oder jeder der beiden Blöcke wird entfernt, und erhalten einen normalen Wert. Ich kann nicht verstehen, |
|
||||
|
Die einzig mögliche Situation hier ist, dass block2 oder block3 sind überfüllt eine Variable auf dem Stack und die Funktion Ihres y var wird verändert. Eine Funktion, die Stack besteht (ein Wachstum von hohen Speicher zu wenig Speicher) von Variablen (in umgekehrter Reihenfolge), eip, esp, Namen und Funktion esp. Hier ist ein einfaches Beispiel für Ihre mögliche Situation: 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();
}
Wie Sie sehen können, variable b Overflows in Variable a. |
|
||||
|
Die falschen Wert zugeordnet ist, wenn y ausführen "y \u003d expression;"
in gdb, "py" wird nach den falschen Wert runing die obige Erklärung ab. , sondern "Ausdruck p" gibt den richtigen Wert. block2 und block3 sind wie folgt aus: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; Wie schon gesagt: nur eine Erklärung: if (a-> is_root) c \u003d m2 - y2; / / y2 normalen nur eine Erklärung: if (! a-> is_root) f \u003d m2 - y2; / / y2 normalen aber: if (a-> is_root) c \u003d m2 - y2; else f \u003d m2 - y2; oder if (a-> is_root) c \u003d m2 - y2; if (! a-> is_root) f \u003d m2 - y2; beide y2 anormal. "y2 \u003d Ausdruck" ist weit weg von if__ andere Struktur __ Vielen Dank für Ihren Unterricht Zuletzt bearbeitet von cdbug; am 11-23-2008 04:28 AM.. |
![]() |
| Lesezeichen |
| Thread Tools | Suche diesen Thread |
| Anzeige-Modi | Rate this thread |
|
|