Forum: Compiler & IDEs sizeof Konfusion


von Sebastian Schildt (Gast)


Lesenswert?

Hallo,

Ich habe gerade massive Probleme mit dem sizeof Operator. Ich vermute
mal wieder das übliche Brett vorm Kopf, aber irgendwie bekomme ich
nicht weiter.

Ich habe mehrere Objekte gleichen Typs hintereinander im Speicher. IM
Prinzip wie ein Array, nur das ich die Länge nicht kenne. Also gibt es
zu jeder Liste ein Abschlusselement das ich erkennen kann. Prinzipiell
gehe ich also so durch die Liste )element ist ein Zeiger auf einen
struct vom Typ elementType)

while (element != NULL) {
   machwas_mit(element);
   element+=sizeof(struct elemtType);
}

Ich wunder mich schon die ganze Zeit warum er Einträge zu
"überspringen" scheint bis ich folgendes versucht habe:

PORTC=sizeof(struct rePARTSTransition);
currentList=currentList+sizeof(struct rePARTSTransition);

Die Zeilen stehen so direkt hintereinander im Source. Der Assembler
dazu sagt:

---- d:\atmel\reparts\fsm.c
-----------------------------------------------------------------------
34:            PORTC=sizeof(struct rePARTSTransition);
+0000024C:   E083        LDI     R24,0x03         Load immediate
---- No Source
------------------------------------------------------------------------ 
------------
+0000024D:   BB85        OUT     0x15,R24         Out to I/O location
---- d:\atmel\reparts\fsm.c
-----------------------------------------------------------------------
35:            currentList=currentList+sizeof(struct rePARTSTransition);
+0000024E:   9639        ADIW    R30,0x09         Add immediate to
word

Warum addiert er beim 2. mal 9? 3 wäre richtig, oder sagen wir mal 3
erwarte ich.

Hilfe!

MfG

Sebastian

von Sebastian Schildt (Gast)


Lesenswert?

Noch ein kleiner Nachtrag: Auch wenn ich

currentList=currentList+3;

schreibe addiert er 9, d.h. nach
+0000024E:   9639        ADIW    R30,0x09         Add immediate to
word

sehe ich dann auch dass sich der Pointer um 9 Byte statt 3 verschoben
hat, bei

currentList=currentList+12;

addiert er 0x24
+0000024E:   9639        ADIW    R30,0x24         Add immediate to
word

Ich muss allerdings auch sagen, dass mir der generierte Assemblercode
nicht 100% klar ist wo er da so rumspringt (bin das nicht so gewohnt
den C Code mit ASM zu vergleichen).

Ich werde mir das morgen nochmal genauer anschauen und evtl. versuchen
mal nen kleineren Testcase zu bauen, aber für heute ist erst mal
Schluss.

von Rufus T. Firefly (Gast)


Lesenswert?

Da "element" vein Void-Pointer ist, addiert die Pointerarithmetik hier


   element += sizeof (struct elemtType);

nicht n Bytes, sondern n * die Größe eines Elementes.

Schröbest Du also

   element++;

dann sollte sich die Angelegenheit so verhalten wie erwartet.

Anscheinend ist Dein struct elementType ziemlich klein (3 Bytes?), das
würde jedenfalls das Verschieben des Pointers um 9 statt um 3 Bytes
erklären.

von Sebastian Schildt (Gast)


Lesenswert?

Oh kacke!

Notiz an mich: Nochmal durch den K&R. Solange bis das sitzt :D

Danke mann! Was ich mir schon wieder alles für Theorien zurecht gelegt
habe! Ich hätte das bestimmt in 2 Wochen nicht gefunden. Dabei ist es
nicht mal das Problem, das ich nicht weiß wie das mit den Pointern
funktioniert, ich scheine nur gerade mein Wissen komplett ignoriert zu
haben :)

Und ja, das struct ist nur 3 Byte groß, das haste richtig erkannt :)

MfG

Sebastian

von Rufus T. Firefly (Gast)


Lesenswert?

Kann jedem passieren. Manchmal ist die Wand halt doch härter als der
Kopf; ich hab' sowas auch manchmal.
Freut mich, Dir helfen gekonnt zu haben.

(und ein Kompliment an Dich für die so eindeutig formulierte Frage)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.