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