Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Komisches Pointer Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.02.2005, 18:01 Uhr
~Fox
Gast


Also ich habe diese Funktion:

C++:
int queue_add (struct queue *queue, void *data, size_t size)
{
if (queue->queuec == 0)
    {
    queue->queue = malloc (sizeof (void *));
    }
else
    {
    realloc (queue->queue, queue->queuec * sizeof (void *) + sizeof (void *));
    }

queue->queue [queue->queuec] = malloc (size);
queue->queue [queue->queuec]) == NULL;
memcpy (queue->queue [queue->queuec],data , size)) == NULL;
queue->queuec++;

return TRUE;
}



Wenn ich diese 5 aufrufe, bekomm ich beim 5. Mal ein SIGSEGV. GDB sagt das hier:

Code:
Program received signal SIGSEGV, Segmentation fault.
0xb7f24b8b in _int_realloc () from /lib/tls/libc.so.6


Naja ich weiß nicht weiter, da für mich alles logisch aussieht und es ja auch 4x funktioniert.
Danke für eure Hilfe.

Dieser Post wurde am 15.02.2005 um 18:01 Uhr von Fox editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.02.2005, 18:27 Uhr
~Fox
Gast


Achso ich habe noch eine Frage: wie kann ich im die Größe von Daten, auf die der void * zeigt ermitteln.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.02.2005, 00:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Sorry, der Code ist Schrott. Wie funktioniert, wurde Dir bereits hier gezeigt
www.fun-soft.de/showtopic.php?threadid=10540&time=1108509658
Das Problem ist, daß Du realloc falsch anwendest (Du mußt den Rückgabewert von realloc auswerten, ignorierst ihn hier aber!)

Zu Deiner Frage in Post 002: garnicht. Du mußt die Größe separat speichern.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 16.02.2005 um 00:25 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.02.2005, 16:30 Uhr
~Fox
Gast



Zitat von virtual:
Sorry, der Code ist Schrott. Wie funktioniert, wurde Dir bereits hier gezeigt
www.fun-soft.de/showtopic.php?threadid=10540&time=1108509658
Das Problem ist, daß Du realloc falsch anwendest (Du mußt den Rückgabewert von realloc auswerten, ignorierst ihn hier aber!)

Zu Deiner Frage in Post 002: garnicht. Du mußt die Größe separat speichern.

Ich habe die Rückagbewerte alle überprüft (habe den Code aber für das Forum entfernt [erleichtert das Lesen]).

Dieser Post wurde am 16.02.2005 um 16:31 Uhr von Fox editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.02.2005, 16:41 Uhr
virtual
Sexiest Bit alive
(Operator)


@Fox

Du schreibst, 4 Durchläuge gehen gut, der 5. jedoch nicht. Die meisten 32 Bit Systeme belegen Speicher in 16 Byte Schritten, dh daß das malloc zunächst einen Pointer zurück gibt, in den 4 char* Objekte reinpassen (da sizeof(char*)==4). Danach werden also drei durchläufe gemacht, wo realloc zunächst keinen Bedarf hat, Speicher neu zu belegen. Die Zeile mit dem Realloc schaut so aus:

C++:
realloc (queue->queue, queue->queuec * sizeof (void *) + sizeof (void *));


(WEnn der echte Quellcode anders aussieht, dann poste ihn bitte! - Das ist kein Quizcontest hier ). Also nach dem 3. realloc ist queue->queuec==4. Nun gehst Du hin und sagst dem Realloc: bitte hole 4*sizeof(char*)+sizeof(char*) == 4*4 +4 = 20 Byte, also muß Realloc neuen Speicher belegen. Du gehst aber nirgends hin und merkst Dir, was realloc zurückgibt. Das ist ein Fehler.

Zur richtigen verwendung von realloc siehe die Dokumentation von realloc oder das oben zitierte Post.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.02.2005, 17:37 Uhr
~Fox
Gast



Zitat von virtual:
@Fox

Du schreibst, 4 Durchläuge gehen gut, der 5. jedoch nicht. Die meisten 32 Bit Systeme belegen Speicher in 16 Byte Schritten, dh daß das malloc zunächst einen Pointer zurück gibt, in den 4 char* Objekte reinpassen (da sizeof(char*)==4). Danach werden also drei durchläufe gemacht, wo realloc zunächst keinen Bedarf hat, Speicher neu zu belegen. Die Zeile mit dem Realloc schaut so aus:

C++:
realloc (queue->queue, queue->queuec * sizeof (void *) + sizeof (void *));


(WEnn der echte Quellcode anders aussieht, dann poste ihn bitte! - Das ist kein Quizcontest hier ). Also nach dem 3. realloc ist queue->queuec==4. Nun gehst Du hin und sagst dem Realloc: bitte hole 4*sizeof(char*)+sizeof(char*) == 4*4 +4 = 20 Byte, also muß Realloc neuen Speicher belegen. Du gehst aber nirgends hin und merkst Dir, was realloc zurückgibt. Das ist ein Fehler.

Zur richtigen verwendung von realloc siehe die Dokumentation von realloc oder das oben zitierte Post.

Achso, d.h. also wenn ich sowas habe (extracted from the source ):

C++:
if (realloc (queue->queue, queue->queuec * sizeof (void *) + sizeof (void *)) == NULL) {printf ("Fehler");}


Ist das ein Indiz dafür, daß kein Speicher reserviert wurde (mit malloc [wusste ich vorher auch nicht; ich dachte realloc macht das von alleine]). Diesen Speicher muß ich dann reservieren und dann nochmal realloc aurufen. Stimmt's?

Danke
Fox

Dieser Post wurde am 16.02.2005 um 17:38 Uhr von Fox editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.02.2005, 17:55 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein: Du musst nicht raten, sondern einfach mal die Doku von realloc anschauen: Der Rückgabewert von realloc muß gemerkt werden, er ist die neue Startadresse von deiner Queue. Ist er NULL, gibt es keinen Speicher.... Der Code ist falsch. Ich schnall einfach nicht, warum Dir nicht mein letztes Post aus diesem Thread mal anschaust, wie bereits zweimal empfohlen. Da ist die korrekte Implemenitierung doch schon drin?

I resign.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.02.2005, 18:42 Uhr
~Fox
Gast



Zitat von virtual:
Nein: Du musst nicht raten, sondern einfach mal die Doku von realloc anschauen: Der Rückgabewert von realloc muß gemerkt werden, er ist die neue Startadresse von deiner Queue. Ist er NULL, gibt es keinen Speicher.... Der Code ist falsch. Ich schnall einfach nicht, warum Dir nicht mein letztes Post aus diesem Thread mal anschaust, wie bereits zweimal empfohlen. Da ist die korrekte Implemenitierung doch schon drin?

I resign.

Sorry, aber danke dür deine Hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.02.2005, 20:02 Uhr
~Fox
Gast


Ich muss dich (euch) leider nochmal belästigen, da ich noch ein Problem habe: Wenn ich die Funktion mit Strings aufrufe, funktioniert alles super (da per %s Parameter printf () mitgeteilt wird, daß es den String aus der Speicheradresse liest), aber mache ich das z.B. mit int Werten, sehe ich ja nur die Speicheradresse. Wie kann ich nun Printf veranlassen, nicht die Speicheradresse, sondern die Daten, welche sich dort befinden auszugeben?

Danke
Fox
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.02.2005, 21:02 Uhr
enno-tyrant
Frag nicht!



C++:
...
int i=10;
...
printf("Der Wert der IntegerVariable ist: %d",i);
...


--
...um etwas zu verstehen muß man wissen wie es funktioniert...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: