2017-08-04 1 views
0

Wenn wir einen ganzzahligen Zeiger dereferenzieren sagen * (int *)
wie wir wissen, dass Integer-Zeiger dominieren 8 Byte in 64-Plattform. aber integer dauert immer noch 4 Byte in 64 Plattform.Dereferenz eine Ganzzahlzeiger auf 64-Bit-Plattform

Was ist, wenn ich einen Zeiger dereferenzieren möchte, wo der Anfang seines Speichers eine andere Zeigeradresse enthält. also eigentlich möchte ich den Wert der ersten 8 Bytes nehmen. wird dereferenz * (int *) 4 Byte oder 8 Byte bekommen? Ich denke, es sollte 4 Byte als Integer 4 Byte sein. aber wie kann ich 8 Byte in 64-Bit-Plattform bekommen? ohne zu wissen, ob die Plattform 32 oder 64 Bit ist.

+0

Es ist ein bisschen schwer zu folgen. Können Sie uns als Beispiel ein kleines Code-Snippet geben? – litelite

+3

Wenn der "Anfang seines Speichers eine andere Zeigeradresse enthält", müssen Sie über einen Zeiger auf den Zeiger, nicht einen Zeiger auf int, dereferenzieren. Wenn das "Ding" an einer Adresse eine andere Adresse ist, dann ist ein Zeiger auf den Zeiger der einzige logische Weg, um zu (und schließlich * durch *) zu gelangen. Alles in allem hat dies einen fast überwältigenden stechenden Geruch eines [XY-Problems] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Was machst du wirklich, und wie bist du zu dieser Menagerie als Mechanismus gekommen, um es zu lösen? – WhozCraig

+0

Wenn Sie versuchen, die Verwendung von 8 Bytes zu erzwingen, können Sie 'int64_t' anstelle von' int' verwenden. – MikeChav

Antwort

3

Lässt einige Dinge klar machen (das sind alle plattformunabhängig, aber in den meisten Fällen), wenn auf Ihrem System:

sizeof(int) is 4 bytes 
sizeof(int*) is 4 on 32bit and 8 on 64bit 
sizeof(int**) is 4 on 32bit and 8 on 64bit 

Wenn Sie dereferenzieren einer int*, Sie sind ein int extrahieren. Das Original int* kann 8 Bytes auf einem 64-Bit sein, aber Sie erhalten 4 Bytes von 32-Bit- oder 64-Bit-Systemen. Wenn Sie eine int** dereferenzieren, extrahieren Sie eine int*. Das Original int** kann 4 Byte bei 32 Bit oder 8 Byte bei einem 64 Bit sein, aber Sie erhalten 4 Byte von einem 32 Bit System und 8 Byte von einem 64 Bit System, weil Sie int* extrahieren.

0

Ich bin nicht sicher, ob ich Ihr Problem richtig verstehe, aber eigentlich denke ich, dass Sie überhaupt kein Problem haben, weil der Compiler Wortgrößen automatisch für Sie verarbeitet und den richtigen Code für jede Plattform generiert . Nehmen wir also an, dass Sie eine Funktion aufrufen, die einen Zeiger auf einen Zeiger auf einen int zurückgibt:

int** ppiValue = SomeFunction(); 

Wenn Sie Dereferenzierung dieses Zeigers, Sie einen Zeiger auf einen int zu erhalten, die die richtige Größe auf jeder Plattform haben wird:

int* piValue = *ppiValue; 

Dies wird 8 Bytes auf einem 64-Bit-Prozessor sein, oder 4 Bytes auf einem 32-Bit-Prozessor. Der Compiler ist verantwortlich für die Auswahl der richtigen Größe für die ausgewählte Zielplattform. Lassen Sie uns nun diesen Zeiger dereferenzieren:

int iValue = *piValue; 

Dies wird ein 4-Byte-Wert auf beiden Prozessoren sein. Wiederum ist der Compiler verantwortlich für das Erzeugen von korrekten Maschinencodeanweisungen.

Also nicht stören - solange Sie sich auf starke Typisierung verlassen und keine gefährlichen Typumwandlungen verwenden, kümmert sich der Compiler um die Indirektionierungsdetails auf niedriger Ebene.

Verwandte Themen