2016-03-21 8 views
0

Dies ist mein Code.Adressberechnung für Variablen innerhalb der Struktur

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

struct test 
{ 
    unsigned int x; 
    long int y: 32; 
    unsigned int z; 
}; 

int main() 
{ 
    struct test t; 
    unsigned int *ptr1 = &t.x; 
    unsigned int *ptr2 = &t.z; 
    printf("ptr1 address is %p\n", ptr1); 
    printf("ptr2 address is %p\n", ptr2); 
    printf("size: %d", ptr2 - ptr1); 
    return 0; 
} 

Dies ist die Ausgabe:

ptr1 address is 0028FEDC 
ptr2 address is 0028FEE4 
size: 2 

Ich glaube, ich bin ein Punkt hier in meinem Verständnis des Ausgangs fehle. Ich habe erwartet, dass die Ausgabe 4 ist. Da, lange int belegt 4 Bytes auf meiner Maschine. Und ich bekomme den Unterschied zwischen der Adresse von x und z. Nicht die reale Ausgabe, sondern die Ausgabe I, die durch die manuelle Subtraktion der Adresse von x und z erhalten wird, macht Sinn. Wenn Sie oben sehen, 28FEE4-28FEDC = 8 nach meiner Berechnung, aber Ausgang ist 2. Kann mir jemand sagen, wo ich meine Berechnungen falsch gemacht habe?

+0

Wenn Sie eine 32-Bit-Ganzzahl mit Vorzeichen in Ihrer Struktur verwenden möchten, verwenden Sie Bitfelder anstelle von z. 'int32_t'? –

+0

Sie müssen den Unterschied der Zeiger durch die Größe des Typs, auf den gezeigt wird, skalieren, um die Anzahl der Bytes zu erhalten: 'ptr2-ptr1' = 2, multiplizieren mit' sizeof (unsigned int) ', was offensichtlich 4 ist System, um 8 Bytes zu bekommen. – owacoder

+0

Technisch ist Ihre Subtraktion der beiden Zeiger * undefiniertes Verhalten *, da sie nicht beide auf das "Objekt" zeigen. –

Antwort

1

das Verhalten zu erklären, Sie bei Ihrer Struktur könnte wie folgt aussehen:

 
+---+---+---+ 
| x | y | z | 
+---+---+---+ 
^  ^
|  | 
&t.x &t.z 

Der Unterschied zwischen &t.x und &t.z ist zwei Elemente, erste &t.x-&t.y, und dann ein von &t.y zu &t.z.

Es sollte beachtet werden, dass dies funktioniert nur, weil alle drei Typen die gleiche Größe haben und der Compiler keine Auffüllung innerhalb der Struktur hinzugefügt haben.

+0

Scheint so, als ob ich wegen des Wertes der Adresse darüber nachgedacht habe und vergessen habe, es durch den Zeigertyp zu skalieren. Vielen Dank! –

+0

Und danke für den Hinweis über die Polsterung. Ich habe vergessen, das auch zu berücksichtigen. –

Verwandte Themen