![]() |
Hallo und herzlich Willkommen aus den Vereinigten Staaten, die UNIX-und Linux-Foren! Vielen Dank für Ihren Besuch und die Teilnahme an unserem Global Community.
|
|
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 |
| Welche Base Level Filesets benötigen ein bestimmtes Programm? | cypher82 | UNIX für Fortgeschrittene und Experten | 4 | 05-29-2008 09:07 AM |
| Hilfe zu C-Programm | dwgi32 | High-Level-Programmierung | 2 | 11-19-2007 10:44 AM |
| Weird an Betriebsstrukturerhebung und VGs | mhenryj | AIX | 4 | 11-13-2007 04:42 PM |
| Weird Ergebnisse mit awk | amatheny | Shell Programmierung und Scripting | 2 | 11-01-2007 06:12 PM |
| Weird Nachricht? | lesstjm | UNIX for Dummies Questions & Answers | 6 | 01-04-2002 10:01 AM |
![]() |
|
|
LinkBack | Thread Tools | Suche diesen Thread | Rate Thread | Anzeige-Modi |
|
|
|
||||
|
Weird C-Programm. Help Needed
Hi,
Bitte lesen Sie hierzu folgendermaßen vor: Wenn ich eine Erklärung: char * i, j [15], * k; und dann sprintf (k, "print.sh% s", i); das Programm funktioniert. Aber wenn ich die Erklärung: char * i, * k; und dann sprintf (k, "print.sh% s", i); Ich ein segmentation fault auf der "sprintf" Erklärung. Das Programm funktioniert nur, wenn j ist ein Array von 15. Nichts weniger / mehr ![]() Bitte beachten Sie: Variable j ist nur ein Dummy. Ich habe absolut nichts mit ihm. Auch weiß ich, mit sprintf die Art, wie ich getan haben, ist illegal. Der Zeiger ist nicht für alles, vor einer solchen Erklärung. Es kann dumm aber bitte jemand erklären, warum dies geschieht? Raten Sie mal etwas zu tun mit der Art und Weise Speicher zugeordnet ist.Vielen Dank im Voraus! |
|
||||
|
Sie versuchen zu schreiben, um zufällige Speicher als "k" ist nicht darauf an etwas. Der Kernel kann Ihnen drei Antworten ...
(a) Sie tun es (b) fallen, weil Sie sich schriftlich an Read Only Memory, z. B. das Programm Bild (c) fallen, weil Sie schreiben in den Speicher, die nicht für Sie |
|
||||
|
Nun, auf der obigen Zeilen, ich könnte weitere ableiten:
1. in einem Fall, T, die auf stdout (dont know how!), coz Speicher waren, dass der Inhalt meiner printf-Anweisung, die vor dem sprintf. (Überraschende!) 2. In einem Fall, T, die auf der String Teil meiner sprintf Erklärung. Daher noch einmal: Es ist nicht illegal, und das Programm funktionieren würde. (Scheint möglich zu sein). Allerdings ist diese Art von Müll Initialisierungen gültig, aber offenbar nur geschehen, wenn Variable j erklärt wird. Else, hält das Programm von SEGV. Aber ich glaube, dies ist ein besonderer und einmaliger Fall. Erraten Sie die gleiche Code funktioniert nicht auf einem anderen Rechner. (Mine ist Solaris). Alle Kommentare / Eingänge / weitere Einblicke anyone? |
|
||||
|
Der Stapel ist, dass die Haupt-mit werden nicht unberührt Virgin Speicher, wird es verwendet wurden für Unterprogramm-Aufrufe, ob durch das Programm der Prolog, dh crt0.o (oder was auch immer) vor der main () aufgerufen.
Der Speicher ist in der Tat in einem unbekannten Zustand, aber ich nehme Ihren Hinweis auf den Inhalt als wiederholbare, unter bestimmten Bedingungen. Ich würde es einen Fall von Deja-vu. ![]() |
|
||||
|
zustimmen
. In wiederholten läuft das Programm Variablen werden die gleichen Speicherplatz.Auch beim Lesen in einer sehr großen String (20 Zeichen) und senden es an sprintf, es ist erstaunlich, wie es keine segmentation fault. An einem gewissen Punkt, es sei denn, 'K' ist, die auf stdout, die Länge der Speicher sollte Verletzung verursachen, und sollte sich SEGV Recht? Auch, wenn überhaupt "k" auf stdout, durch eine bündig sofort, ich sollte den Inhalt des "k" Recht? coz könnte überschreiben vorherige Inhalt von stdout. |
|
||||
|
Zitat:
Sind Sie laufen unter gdb und sehen, wo es wirklich geht? |
|
||||
|
Sie haben ein Problem in beiden Fällen. Man ist gefangen, der andere nicht.
"char * i, j [15], * k", sagt die folgenden: Point-to-Call-Speicher und die Zeiger i; Platz im Speicher zu 15 Zeichen, dass die Raum-und Call-j; und zeigen Sie auf Speicher und fordern, dass die Zeiger k; Wenn Sie versuchen zu tun, "sprintf (k," print.sh% s ", i);" Sie fordern die Computer zu halten, die die Zeichenkette "print.sh?" in den Speicher für Sie auf den Zeiger mit Variable k. Ihr Problem ist, dass Sie nicht alle, die Speicherplatz für die Zeichenfolge an der Lage der Zeiger K, K ist derzeit nur, die auf einige zufällige Speicher und kein Platz zugewiesen worden ist, um etwas auf die Speicherstelle, auf die K. Das ist der Grund, es stirbt. Der Grund ist doensn't die (noch) in dem Beispiel, wo j zugeordnet ist Raum, ist, dass es zumindest etwas Platz auf der Stack, und k ist wahrscheinlich versehentlich darauf gibt, und daher j korrumpieren, aber nicht zu einer SEGV (noch). Ich schlage vor, Sie gehen Studie über die Unterschiede auf * k, k [10], K [10,10] und ** k. Wenn Sie verstehen, was diese verschiedenen Formen bedeuten, Systemadministrator Sie haben eine wesentlich bessere Tag. |
![]() |
| Lesezeichen |
| Thread Tools | Suche diesen Thread |
| Anzeige-Modi | Rate this thread |
|
|