mikrocontroller.net

Forum: PC-Programmierung Nach Funktionsaufruf alle Pointer auf 0xbaadf00d


Autor: 0xbaadf00d (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Und wieder mal habe ich ein C-Problem mit Programmieren.
Ich möchte, dass ihr eure Glaskugeln mal anwerft, bevor ich den Code auf 
das wesentliche minimiere um euch den Fehler zu zeigen.
Also was gibt es für typische Fallgruben bei folgendem Problem:
Am Anfange initialisiere ich einige Variablen und Pointer. Dann rufe ich 
eine Funktion mit zwei Parametern auf (einen Pointer und einen Int). Am 
Schluss gibt die Funktion einen Int zurück.
Ich habe das ganze mal mit Visual Studio 2008 im SingleStep-Modus 
durchgearbeitet und stelle folgendes fest:
(keine Compilerwarnungen nach dem Compilieren)
Es läuft alles wunder bar, bis die Funktion, welche aufgerufen wird, an 
main zurück gibt (keine Fehler oder auffälliges) wieder im main 
angelangt sind ausser dem Rückgabewert alle Pointer und Variablen 
(wirklich alle, auch diejenigen die der Funktion nicht übergeben wurden) 
verstellt.
Die Pointer haben den (auffälligen) Wert: 0xbaadF00d, die ints 
-1163005939.
Was könnte die Ursache sein? Wie gesagt in der Funktion läuft alles gut, 
und nach dm Zurückgeben (kein Befehl dazwischen) ist alles verstellt -->

Vielen Dank für Tipps
Falls es nicht anders geht werde ich mal noch versuchn eine 
Minimalversion herstellen, die das gleiche Problem zeigt. Aber da das 
Projekt ziemlich verschachtelt ist wird das schwierig.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xbaadf00d wrote:

> Was könnte die Ursache sein? Wie gesagt in der Funktion läuft alles gut,
> und nach dm Zurückgeben (kein Befehl dazwischen) ist alles verstellt -->

Stack zerschossen.
Klappere mal deine Arrays auf Out Of Bounds Zugriffe ab.

Autor: 0xbaadf00d (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
THX, das wars, hatte in einem 2dimensionalen Array Zeilen und Spalten 
vertauscht! Danke, aber irgendwie ist die Fehlermeldung nicht sher 
anschaulich...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xbaadf00d wrote:
> THX, das wars, hatte in einem 2dimensionalen Array Zeilen und Spalten
> vertauscht! Danke, aber irgendwie ist die Fehlermeldung nicht sher
> anschaulich...

Welche Fehlermeldung?
Es gibt keine Fehlermeldung!

Wenn du in einem Buch wahllos irgendwelche Buchstaben gegen
andere austauscht, wird der Leser irgendwann mal straucheln
ohne zu wissen warum.

Autor: 0xbaadf00d (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, Fehlermeldung war das falsche Wort. Wenn ich mir das nun überlege, 
wie es im Speicher aussieht, dann ist mir auch klar, dass es da 
fortlaufend (mit steigender Adresse) gespeichert wird und nicht 
irgendwie 2dimensional wie das Array. Allerdings weshalb kann der 
Kompiler nicht reklammieren wenn ich sowas mache:

int array[10][20];
array[15][10] = 133;

Da müsste ihm doch auch auffallen, dass dies nicht so gewollt ist?

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C gibt dir genügend Freiheit, dir ins Bein zu schiessen. Zweimal.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xbaadf00d wrote:

> irgendwie 2dimensional wie das Array. Allerdings weshalb kann der
> Kompiler nicht reklammieren wenn ich sowas mache:
>
> int array[10][20];
> array[15][10] = 133;
>
> Da müsste ihm doch auch auffallen, dass dies nicht so gewollt ist?

In dem Fall könnte er es. In der Mehrzahl der Fälle kann er es aber
nicht. Wenn überhaupt dann könnte er höchstens in den Code eine
Prüfung einbauen, die zur Laufzeit überprüft, ob eine Bereichs-
überschrietung stattfindet.
Aber auch hier: Es gibt Fälle in denen auch das nicht möglich ist
(wenn zb. dynamische Speicherallokierung im Spiel ist).

Ergo: Wenn der Compiler in manchen Fällen warnen würde, dann gibt
es genug Zeitgenossen, die sich auf diese Warnung verlassen und
dann erst recht auf die Schnuaze fallen.

Eine Compilerwarnung ist nur dann sinnvoll, wenn der Compiler auch
wirklich jeden möglichen Verstoss erkennen kann. Wenn das nicht
geht, dann ist eine Warnung eher kontraproduktiv, weil sich die
Programmierer dann in falscher Sicherheit wähnen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.