2010-08-29 9 views
5

Wie ergibt sich eine literale Speicheradresse im Hexadezimalformat, wie kann ich einen Zeiger in C erstellen, der diesen Speicherort adressiert?Speicheradresse Literal

Speicheradressen auf meiner Plattform (IBM iSeries) sind 128 Bit. C-Typ long long ist auch 128bit.

Man stelle ich eine Speicheradresse in eine Zeichenfolge (char array) haben, die: C622D0129B0129F0

ich die richtige C-Syntax übernehmen direkt diese Speicherstelle zu adressieren:

const char* const p = (const char* const)0xC622D0129B0129F0ULL

I verwenden ULL Suffix gibt unsigned long long literal an.

Ob mein Kernel/Plattform/Betriebssystem es mir erlaubt, dies zu tun, ist eine andere Frage. Ich möchte zuerst wissen, ob meine Syntax korrekt ist.

+3

Hölle eines Adressraums. – GManNickG

+0

Das war früher die AS/400. Die Hölle einer Maschine allgemein. –

Antwort

12

Ihre Syntax ist fast korrekt. Sie brauchen nicht einer von denen const:

const char* const p = (const char*)0xC622D0129B0129F0ULL 

Die const unmittelbar vor p zeigt an, dass die Variablep kann nicht nach der Initialisierung geändert werden. Es bezieht sich nicht auf etwas, was auf zeigt, so dass Sie es nicht auf der rechten Seite benötigen.

+0

Der Compiler, der dies akzeptiert, ist ein guter Anfang, garantiert jedoch nicht die Konformität mit Standards. In Compilern sind viele Erweiterungen implementiert. Das sagte, ja, das sieht richtig aus. –

+1

Nein, dies ist ein undefiniertes Verhalten. Nur die Konvertierung in 'void *' soll etwas richtiges geben und 'uintptr_t' könnte sich von 'unsigned long long' unterscheiden (obwohl in diesem Fall unwahrscheinlich) –

+2

Jens ist falsch - das Verhalten ist implementierungsdefiniert, * nicht * undefiniert – Christoph

0

Es gibt nicht so etwas wie eine Adresse wörtliche in C.

Das einzige, was zwischen ganzen Zahlen und Zeiger arbeiten gegossen von void* zu uintptr_t (falls vorhanden) und dann wieder gewährleistet ist. Wenn Sie Ihre Adresse irgendwo als Integer haben, sollte das vom Typ uintptr_t sein. Verwenden Sie etwas wie

(void*)(uintptr_t)UINTMAX_C(0xC622D0129B0129F0) 

, um es zurück zu konvertieren.

Sie müssten stdint.h einschließen, um den Typ uintptr_t und das Makro UINTMAX_C zu erhalten.

+0

-1: C99 definiert nur Makros für Integer-Konstanten mit minimaler Breite und größter Breite - es gibt kein Makro 'UINTPTR_C()' in 'stdint.h' – Christoph

+0

@Christoph: Ihre zweite Behauptung ist korrekt. Ich werde meine Antwort entsprechend bearbeiten. –

+0

wurde entfernt. reparierte auch die fehlende '0x' ... – Christoph

Verwandte Themen