PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (C/C++) Pointer - Speicherinhalt falsch



7.e.Q
23-03-2006, 10:24
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.




#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.

jeebee
23-03-2006, 12:04
wenn ich den geposteten code mit
gcc -Wall -o umbiegen_original umbiegen_original.c kompiliere erhalte ich die folgenden Fehler:
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:
typedef struct _Struktur {
int value;
char c;
} Struktur;

7.e.Q
23-03-2006, 12:26
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.

Joghurt
23-03-2006, 13:22
Also bei mir gehts, vorrausgesetzt, ich ersetze "struct sStrucktur" durch sStrucktur.

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

Wenn du nun
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
#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;
}

7.e.Q
23-03-2006, 13:44
Es geht nicht um die Syntax da oben, sondern um das Problem mit dem vergrützten Pointer.

Joghurt
23-03-2006, 13:53
Und wie geschrieben geht es bei mir

7.e.Q
23-03-2006, 14:19
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...