sizeof Konfusion

Gast #180658
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
Gast
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.
Gast
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.
Gast
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
Gast
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)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.