Typumwandlung in c
-
Hallo, ich habe festgestellt, das ich probleme habe mit typkonvertierungen. Ich meine jetzt nicht so sachen wie:
short s; int p; p = (int)s;
Sondern eher soetwas hier:
typedef struct zonedebug_s { char *label; char *file; int line; int allocSize; }zonedebug_t; typedef struct memblock_s { int size; int tag; struct memblock_s *next, *prev; int id; #ifdef ZONE_DEBUG zonedebug_t d; #endif }memblock_t; typedef struct { int size; int used; memblock_t blocklist; memblock_t *rover; } memzone_t; void Z_ClearZone( memzone_t *zone, int size ) { memblock_t *block; block = (memblock_t *)((byte *)zone + sizeof(memzone_t) ); // <===== zone->blocklist.next = (memblock_t *)((byte *)zone + sizeof(memzone_t) ); // <===== zone->blocklist.prev = (memblock_t *)((byte *)zone + sizeof(memzone_t) ); // <===== zone->blocklist.tag = 1; zone->blocklist.id = 0; zone->blocklist.size = 0; zone->rover = block; zone->size = size; zone->used = 0; block->prev = block->next = &zone->blocklist; block->tag = 0; block->id = ZONEID; block->size = size - sizeof(memzone_t); }
Hat vielleicht jemand eine art Eselsbrücke, oder ein anschauliches Diagram für solche Sachen? Bei dem Beispiel oben versteh ich nur Bahnhof, und auch aus Büchern werd ich irgentwie nicht schlau. Darin wird nur beschrieben was man wie casten darf aber nicht, was im speicher passiert (vorallem bei pointern s.o)
Danke schonmal...
-
-
zone->blocklist.prev = (memblock_t *)((byte *)zone + sizeof(memzone_t) ); // <=====
Ist das dann so:
zone->blocklist.prev = ein zeiger vom typ memblock_t zu einer funktion mit dem parameter (zone vom typ zeiger auf byte + die größe von memzone_t) ???
-
nein
-
asdca schrieb:
nein
wie dann? ich sach doch Bahnhof
-
Jetzt hab ichs, och man....
sizeof() gibt die größe in Bytes zurück und deshalb muss zone zu Byte gecastet werden, um addieren zu können. Danach wird das Ergebnis zu memblock_t gecastet um den Pointer darauf setzen zu können. Im endeffekt zeigt dann zone->blocklist.prev auf eine adresse im speicher der um (zone + memblock_t) weiter liegt als zone selbst ???