Anzeige:
Ergebnis 1 bis 7 von 7

Thema: (C/C++) Pointer - Speicherinhalt falsch

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456

    (C/C++) Pointer - Speicherinhalt falsch

    Hallo,

    ich hab hier (in einem Windows Programm) ein großes Problem, bei dem ich absolut nicht weiter weiß:

    Eine Funktion biegt einen Zeiger auf einen in ihr erstellten Speicherbereich um.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _sStruktur
    {
      int value;
    } sStruktur;
    
    void umbiegen(struct sStruktur **ppPointer);
    
    int main()
    {
      struct sStruktur* pPointer;
    
      umbiegen(&pPointer);
    
      printf("Umgebogen: %i\n", pPointer->value);
    }
    
    void umbiegen(struct sStruktur **ppPointer)
    {
      struct sStruktur* pNeu = (struct sStruktur*)malloc( sizeof(struct sStruktur));
      
      pNeu->value = 10;
      *ppPointer = pNeu;
    );
    So... am Ende der Funktion umbiegen ist pNeu->value noch gültig, enthält den Wert 10. Aber zurück in der main() steht in value nur noch Schwachsinn drin, obwohl pPointer immer noch auf den selben Speicherbereich zeigt. Selbst das Umdeklarieren der Variablen als static brachte keinen Erfolg.

    Das ganze da oben ist nur zur Veranschaulichung. Das eigentliche Problem entstand bei mir in Verbindung mit ffmpeg-0.4.9, der avformat und avcodec Bibliotheken (übersetzt unter MinGW) und (jaja) Windows. Ich nutze die Libs, um mit AVI Files zu arbeiten.
    Geändert von 7.e.Q (23-03-2006 um 12:28 Uhr)

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    wenn ich den geposteten code mit
    Code:
    gcc -Wall -o umbiegen_original umbiegen_original.c
    kompiliere erhalte ich die folgenden Fehler:
    Code:
    umbiegen_original.c:4: Warnung: nutzloses Schlüsselwort oder Typenname in leerer Deklaration
    umbiegen_original.c: In function `main':
    umbiegen_original.c:14: Warnung: implizite Deklaration der Funktion »printf«
    umbiegen_original.c:15: Warnung: Kontrollfluss erreicht Ende einer Nicht-void-Funktion
    umbiegen_original.c: At top level:
    umbiegen_original.c:18: Fehler: in Konflikt stehende Typen für »umbiegen«
    umbiegen_original.c:6: Fehler: vorherige Deklaration von »umbiegen« war hier
    umbiegen_original.c:18: Fehler: in Konflikt stehende Typen für »umbiegen«
    umbiegen_original.c:6: Fehler: vorherige Deklaration von »umbiegen« war hier
    umbiegen_original.c: In function `umbiegen':
    umbiegen_original.c:19: Warnung: implizite Deklaration der Funktion »malloc«
    umbiegen_original.c:22: Fehler: inkompatible Typen in Zuweisung
    Die roten Zeilen hängen damit zusammen, dass du zum Teil einen Pointer auf einen Pointer auf eine Variable vom typ struct sStruktur und zum Teil einen Pointer auf eine Variable vom Typ struct sStruktur verwendest.
    Der Rest der Meldungen bezieht sich auf nicht eingebundene Header (stdio.h und stdlib.h) und ein fehlendes return in der main().

    /edit:
    Der erste Fehler bezieht sich darauf, dass du kein Schlüsselwort für das typedef angegeben hast. Ein Beispiel für ein korrektes typedef:
    Code:
    typedef struct _Struktur {
        int value;
        char c;
    } Struktur;
    Geändert von jeebee (23-03-2006 um 12:06 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Entschuldige, hab vergessen zu erwähnen, daß es sich dabei um ungetesteten Pseudo Code handelt, den ich mir eben aus den Fingern gesogen habe... Ich wollte damit nur das Problem darstellen.

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Also bei mir gehts, vorrausgesetzt, ich ersetze "struct sStrucktur" durch sStrucktur.

    Wenn du z.B. schreibst
    Code:
    struct bla { .... } x;
    ist x eine Variable vom Typ "struct bla", "struct bla" wurde auch gleich mitdefiniert.

    Wenn du nun
    Code:
    typedef struct _foo { ...} foo;
    schreibst, ist foo ein alias für "struct _foo".

    Also entweder du sparst dir den Typedef und schreibst struct foo oder du machst den Typedef und lässt das struct weg (in diesem Falle kannst du natürlich auch "typedef struct { ... } foo" schreiben, solange die struct sich nicht selbst referenziert)

    Hier mal der korrigierte Code
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
         int value;
    } sStruktur;
    
    void umbiegen(sStruktur **ppPointer);
    
    int main()
    {
    
         sStruktur* pPointer;
    
         umbiegen(&pPointer);
    
         printf("Umgebogen: %i\n", pPointer->value);
    }
    
    
    void umbiegen(sStruktur **ppPointer)
    {
    
         sStruktur* pNeu = (sStruktur*)malloc(sizeof(sStruktur));
    
         pNeu->value = 10;
         *ppPointer = pNeu;
    }

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Es geht nicht um die Syntax da oben, sondern um das Problem mit dem vergrützten Pointer.

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Und wie geschrieben geht es bei mir

  7. #7
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Achso... hmm... Dann liegt das vielleicht an der Bibliothek, die ich verwende.

    ... *zeit vergeht*

    Ich hab jetzt mal ein grund neues Projekt angelegt und dort liefert mir die Bibliotheks-Funktion, die nach oben genanntem Prinzip arbeitet, gültige Werte zurück. Ich versteh's nicht...

    Der Wert, der bei mir in value, bzw. einem equivalenten Feld steht, lautet 0xCCCCCCCC, was nach meinem Verständnis alloziierter, aber unbenutzter Speicher ist. Der MSVC++ Compiler füllt ja alloziierten Speicherbereich mit 0xCC auf. Eigenartig finde ich, daß der Wert vor dem return der Lib-Funktion gültig (1) ist, nach dem Wiederkehren in die aufrufende Funktion aber auf einmal 0xCCCCCCCC beinhaltet, obwohl der Zeiger noch immer auf die selbe Stelle zeigt.

    Kann es sein, daß das problematisch wird, wenn man da mit C++ arbeitet und pPointer eine Membervariable einer Klasse ist?

    edit: wird's nicht... ebenfalls getestet, Wert ist in Ordnung. Ich krich das K... Selbst bei abgeleiteten Klassen mit virtuellen Funktionen (wie es in dem Projekt ebenso der Fall ist) ist der Wert in Ordnung.

    Irgendwas funktioniert da nicht... In meinem kleinen Testprojekt funktioniert's. Aber in dem Projekt, wo's funktionieren soll, geht's nicht - obwohl die Schritte eindeutig die selben sind...
    Geändert von 7.e.Q (23-03-2006 um 14:30 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •