Um das zu verstehen, muss man die Eigenheiten der Pointerarithmetik verstehen. Pointerarithmetik in C funktioniert so, dass für einen Pointer ptr der Ausdruck ptr + 1 nicht unbedingt auf die Adresse zeigt, die ein Byte hinter der Adresse, auf die ptr zeigt, liegt. Stattdessen hängt die Adresse von der Größe des Pointertyps ab.
Beispiel:
Code:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
int64_t i64 = 9876;
int64_t* i64_ptr = &i64;
int64_t* i64_ptr2 = i64_ptr + 1;
printf("size of int64_t: %li\n", sizeof(int64_t));
printf("%li\n", i64_ptr);
printf("%li\n", i64_ptr2);
return 0;
}
Der Typ int64_t ist ein vorzeichenloser, 64-Bit großer Integertyp, d.h. er ist 8 Bytes groß. Entsprechend heißt das "+1" in der dritten Zeile innerhalb der main-Funktion auch, dass die neue Adresse so berechnet wird, dass eine Instanz von int64_t zwischen der ursprünglichen Adresse i64_ptr und i64_ptr2 Platz hat. Eine mögliche Ausgabe des obigen Programmcodes wäre folgende:
Code:
size of int64_t: 8
140720987572248
140720987572256
Man sieht also, dass die Adressen sich nicht nur um ein Byte unterscheiden, sondern um acht Bytes, weil der Typ int64_t acht Bytes belegt.
Der Typ char ist hingegen nur ein Byte groß:
Code:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
char c = 'A';
char* c_ptr = &c;
char* c_ptr2 = c_ptr + 1;
printf("size of char: %li\n", sizeof(char));
printf("%li\n", c_ptr);
printf("%li\n", c_ptr2);
return 0;
}
Eine mögliche Ausgabe dieses Programmcodes ist:
Code:
size of char: 1
140726725225831
140726725225832
Durch den Cast nach char wird also erreicht, dass der Plus-Operator bei der Adressberechnung die berechnete nur um mindestgroesse Bytes "verschiebt", und nicht um mindestgroesse * sizeof(mem_node_t) Bytes. Das liegt daran, dass mindestgroesse eine Größe in Bytes bezeichnen soll. Ich vermute zumindest anhand des Codeausschnitts, dass eine Speichergröße in Bytes gemeint ist.