C Zeiger Arithmetik sizeof (struct)

7

Hier ist der Code in Frage

%Vor%

Die Größe von (struct test) gibt 6 aus, also würde Folgendes erwarten:

6 0xffa 0x1006

Stattdessen bekomme ich

%Vor%

Als ich das letzte Mal nachgesehen habe, war 0x24 oder 36 nicht gleich 6. Es ist noch nicht einmal mit irgendetwas ausgerichtet, was ich sagen kann. Ich bin völlig verloren.

Kann mir bitte jemand erklären, warum ich diese Werte bekomme?

    
endeavormac 15.12.2011, 04:44
quelle

4 Antworten

16

Das Problem besteht darin, dass bei der Zeigerarithmetik die Größe des Datentyps um ein multiple erhöht wird.

Was Sie also tun, ist das Hinzufügen von sizeof(struct test) .

Seit sizeof(struct test) = 6 erhöhen Sie die Adresse um 6 * 6 = 36 . Deshalb erhalten Sie 0x1024 und 0xfdc anstelle von 0x1006 und 0xffa . (Sie haben auch die + und - gewechselt, aber das ist eine kleine Sache.)

Stattdessen tun Sie das einfach:

%Vor%     
Mysticial 15.12.2011, 04:47
quelle
4

Wenn Sie eine Zeigerarithmetik wie diese ausführen, bewegen Sie sich um diese Anzahl von Elementen vorwärts oder rückwärts, als ob diese Variable in einem Array wäre. Sie möchten also wirklich a + 1 und a - 1 verwenden, die jedes Mal um 6 Bytes weitergehen sollten.

WICHTIG: Beachten Sie, dass der Compiler in Ihrer Struktur Auffüllung hinzufügen kann, um die Ausrichtung zu erleichtern. Nehmen Sie nicht einfach an, dass, weil Sie zwei Ein-Byte-Zeichen und ein Zwei-Byte-Zeichen haben, Ihre Struktur 4 Byte groß sein wird - das ist hier nicht der Fall. (In der Tat, nicht davon ausgehen, dass Sie die Größe von char oder kurz kennen; Ich habe 2-Byte-Zeichen zuvor gesehen).

    
David Brigada 15.12.2011 04:49
quelle
2

Ich denke, Sie suchen nach a + 1 und a - 1 .

(a + x) ist das gleiche ist &a[x] .

    
leppie 15.12.2011 04:47
quelle
1

Sie haben einen getippten Zeiger.

Wenn Sie also meine 1 erhöhen (d. h. a + 1 ), bedeutet dies a + sizeof(type) .

Also a + sizeof(type) = a + sizeof(type) * sizeof(type) = a + 6 * 6 (in Ihrem Fall als Größe von (Test) = 6)

Dort bekommst du 0x24 oder 36 von.

    
danishgoel 15.12.2011 04:47
quelle

Tags und Links