Problem mit malloc/free (aligned Daten)
-
Hi
Ich habe ein Problem mit malloc/free und komm derzeit einfach auf keine Lösung
Ich habe einen Pointer *p vom typ int. Der soll zb 20 ints abspeichern können, aber zb auf 8 Byte aligned. (das hat in dem beispiel nicht viel Sinn ich weiss, aber es dient jetzt nur zur Fehlerfindung)
Deswegen lege ich den zb so an:
// Diese Variablen sind global int currIndex = 0; int *p; int length = 20; int alignment = 8; int align; if(alignment == sizeof(int)) align = 0; else if(alignment > sizeof(int)) align = alignment - (sizeof(int) % alignment); p = (int*)malloc((sizeof(int)+align)*length);
das geht soweit. Wenn ich jetzt Daten (int) einfüge mache ich folgendes:
void push(int elem) { int iOffset; currIndex++; iOffset = (currIndex*(sizeof(elem)+align)); *(p+iOffset) = elem; }
Wenn ich jetzt am Ende des Programms
free(p)
mache stürzt das Programm ab mit einem Heap error und ich weiss nicht warum
Stimmt irgendetwas mit dem oben geposteten code nicht?
-
p+iOffset
berücksichtigt ja schon die Größe des ints, da p ein Zeiger auf int ist. Wenn Du ein eigenes Alignment implementieren willst, mußt Du p erst mal zu 'nem Zeiger auf char casten bevor Du iOffset hinzuaddierst.
*(int*)((char*)p+iOffset) = elem;
mfg Martin
-
beuschl schrieb:
else if(alignment > sizeof(int)) align = alignment - (sizeof(int) % alignment);
Das sehe ich gerade:
Warum benutzt Du den Modulo operator? alignment ist doch größer als sizeof( int ) also ist sizeof( int ) % alignment == sizeof( int ).
Darüber hinaus ist align undefiniert, wenn es denn mal 65 (oder mehr)-Bit Maschinen gibt. Dann ist nämlich alignment < sizeof( int ).
mfg Martin
-
beuschl schrieb:
Wenn ich jetzt am Ende des Programms
free(p)
mache stürzt das Programm ab mit einem Heap error und ich weiss nicht warum
Stimmt irgendetwas mit dem oben geposteten code nicht?Wenn free abbricht, hast du p selbst (und NICHT *p/p[irgendwas]) seit dem malloc verändert, was Unsinn ist. Das hat mit alignment nichts zu tun.
-
danke für die hilfe nun funktioniert es!
wegen dem %: da hast du recht. hab die if blöcke erst nachher dazugetan und dann nicht mehr wirklich darüber nachgedacht
und die überprüfung ob alignment < sizeof(int) fehlte noch bewusst, da ich ersteinmal das programm richtig zum laufen bekommen wollte, bevor ich mich mit all den abfragen, fehlermeldungen etc befasse