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?
Wenn Sie eine 32-Bit-Ganzzahl mit Vorzeichen in Ihrer Struktur verwenden möchten, verwenden Sie Bitfelder anstelle von z. 'int32_t'? –
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
Technisch ist Ihre Subtraktion der beiden Zeiger * undefiniertes Verhalten *, da sie nicht beide auf das "Objekt" zeigen. –