Ich wollte einen Wert lesen, der an einer Adresse gespeichert ist, deren Absolutwert bekannt ist. Ich frage mich, wie ich das erreichen könnte. Zum Beispiel. Wenn ein Wert bei 0xff73000 gespeichert wird. Dann ist es möglich, den hier gespeicherten Wert über den C-Code abzurufen. Danke im Voraus
Wie man einen Wert von einer absoluten Adresse durch C-Code liest
niteshnarayanlal
Zdenek Gromnica
Zwei Wege:
1. Adressliteral als Zeiger umwandeln:
char value = *(char*)0xff73000;
Wandeln Sie das Literal in einen Zeiger auf den Typ um.
und
Mit dem Präfix dereferenzieren *
.
Dieselbe Technik gilt auch für andere Typen.
2. Weisen Sie die Adresse einem Pointer zu:
char* pointer = (char*)0xff73000;
Greifen Sie dann auf den Wert zu:
char value = *pointer;
char first_byte = pointer[0];
char second_byte = pointer[1];
Wo char
ist der Typ, den Ihre Adresse darstellt.
Juraj Blaho
Weisen Sie einfach die Adresse einem Zeiger zu:
char *p = (char *)0xff73000;
Und greifen Sie nach Belieben auf den Wert zu:
char first_byte = p[0];
char second_byte = p[1];
Beachten Sie jedoch, dass das Verhalten plattformabhängig ist. Ich gehe davon aus, dass dies für eine Art eingebettete Programmierung auf niedriger Ebene gilt, bei der die Plattformabhängigkeit kein Problem darstellt.
-
Danke für die Antworten, ich habe versucht, auf den Statusregisterwert für einen i2c-Bustreiber zuzugreifen. Das oben Gesagte führte zu einer Kernel Panic.
– niteshnarayanlal
12. September 2013 um 4:59 Uhr
-
Wie würde man das machen, wenn Sie die Adresse in einer Variablen haben?
– Benutzer4244405
29. Dezember 2015 um 3:30 Uhr
-
Sie können es einfach kopieren.
– unendlichLerner
6. Januar 2019 um 10:15 Uhr
-
Wooooooh fühlt sich an, als wäre ich gerade der Meister im Array geworden, nachdem ich deine Antwort gelesen habe 🙂
– Santreffen
10. November 2021 um 5:23 Uhr
Ari
char* p = 0x66FC9C;
Dies würde diese Warnung verursachen:
Test.c: In Funktion ‘main’: Test.c:57:14: Warnung: Initialisierung macht Zeiger aus Integer ohne Cast [-Wint-conversion]
Zeichen * p = 0x66FC9C;
Um eine bestimmte Adresse festzulegen, müssen Sie Folgendes tun:
char* p = (char *) 0x66FC9C;
-
Willkommen bei Stapelüberlauf!
– LF
24. Februar 2019 um 11:39 Uhr
-
@LF Gib mir einen Daumen nach oben, damit ich richtig kommentieren und posten kann, hahah
– Ari
24. Februar 2019 um 11:42 Uhr
Technisch ja. Wenn der Wert beispielsweise eine Ganzzahl ist, könnten Sie Folgendes deklarieren:
int *xp = 0xff73000;
dann in Ihrer Codereferenz*xp
. Wird normalerweise auf eingebetteten Systemen verwendet. Wenn Sie dies unter Windows oder Linux versuchen, erhalten Sie wahrscheinlich eine Speicherausnahme.– Schleicher
11. September 2013 um 12:29 Uhr
Jedes Programm hat seinen eigenen Speicher, der vom Betriebssystem zugewiesen wird, daher ist es “unmöglich”, solche Dinge abzurufen. Weiterlesen hier [windows]
– Kyslik
11. September 2013 um 12:29 Uhr
Woher wissen Sie, dass der Wert an dieser Adresse gespeichert ist? Der Punkt des geschützten Modus ist, dass es für eine Anwendung unmöglich ist, fest codierte Speicheradressen zu verwenden. Das ist wahrscheinlich im Land der speicherabgebildeten Geräte. Sind Sie sicher, dass Sie das tun möchten?
– Dan
11. September 2013 um 12:32 Uhr
Würden Sie bitte erklären, was der Kontext Ihres Problems ist? Warum müssen Sie das tun? Programmierst du für Bare Metal?
– Lorenzo Donati unterstützt die Ukraine
11. September 2013 um 12:34 Uhr
Zuerst müssen Sie definieren, welchen Adressraum Sie meinen – physische Adresse oder virtuelle Adresse? Userspace oder Kernelspace?
– Chris Dodd
26. April 2020 um 19:52 Uhr