Wie weisen Sie manuell eine Zeigeradresse zu (z. B. Speicheradresse 0x28ff44
) in der Programmiersprache C?
Wie kann ich die Zeigeradresse in der Programmiersprache C manuell zuweisen?
Irakli
So was:
void * p = (void *)0x28ff44;
Oder wenn Sie es als möchten char *
:
char * p = (char *)0x28ff44;
…etc.
Wenn Sie auf etwas hinweisen, das Sie wirklich, wirklich nicht ändern sollen, fügen Sie ein hinzu const
:
const void * p = (const void *)0x28ff44;
const char * p = (const char *)0x28ff44;
… da ich denke, dass dies eine Art “bekannte Adresse” sein muss und diese normalerweise (wenn auch keineswegs immer) schreibgeschützt sind.
-
Bitte korrigieren Sie mich, falls ich falsch liege. Aber ist es in C nicht undefiniertes Verhalten, einem Zeiger eine ungültige Adresse zuzuweisen? Genauso wie es nicht erlaubt ist, mit Zeigerarithmetik ein Ergebnis zu erzeugen, das weder auf ein gültiges Objekt noch auf ein Array oder 1 Element dahinter zeigt?
– dhein
24. September 2013 um 11:49 Uhr
-
@Zaibis: Ich glaube nicht, dass C, die Sprache, auf die eine oder andere Weise etwas darüber aussagt. Das System, auf dem Sie die Sprache verwenden, ist entscheidend. Delnan hat es im Kommentar zur Frage gut gesagt: „Unnötig zu sagen, dass das eine ziemlich sinnlose – wenn nicht geradezu selbstmörderische – Übung ist, außer vielleicht in bestimmten eingebetteten Systemen.“ Es gibt sehr einige Anwendungsfälle für hartcodierte Zeigerwerte, aber es gibt einige. Ich erinnere mich, dass ich früher in DOS direkt auf den Anzeigespeicher zugegriffen habe … 😉 Daher der obige Kommentar “bekannte Adresse”.
– TJ Crowder
24. September 2013 um 12:02 Uhr
-
@pauluss86: Wahrscheinlich gibt es das, aber ich habe seit 20 Jahren kein C++ mehr gemacht, und ich glaube nicht, dass es sie damals gab … 🙂
– TJ Crowder
30. Januar 2014 um 17:42 Uhr
-
@TJCrowder – Tatsächlich gibt es sie viele verwendet für fest codierte Zeiger. Dies geschieht ständig in Mikrocontrollern sowie in Bootloadern und Treibern “normaler” Systeme. Normalerweise könnte der Zeiger selbst sein
const
aber die Daten, auf die es zeigt, sind es nicht. Die meisten Programmierer sehen diesen Code einfach nie oder haben keine Ahnung, wie er funktioniert. Obwohl ich hinzufügen möchte, dass dies zunehmend der Ort wird, an dem C immer noch am relevantesten ist, da immer weniger Anwendungssoftware einen wirklichen Grund hat, in C geschrieben zu werden.– Brian McFarland
17. September 2015 um 14:05 Uhr
-
@geeeeekyDeveloper – Das bedeutet, dass Sie einstellen
p
um auf einen Speicher zu verweisen, in den Sie nicht schreiben dürfen.– TJ Crowder
1. Mai um 7:45 Uhr
Salzbank
Dein Code würde so aussehen:
int *p = (int *)0x28ff44;
int
muss der Typ des Objekts sein, auf das Sie verweisen, oder es kann sein void
.
Aber seien Sie vorsichtig, damit Sie nicht versuchen, auf etwas zuzugreifen, das nicht zu Ihrem Programm gehört.
kamal
int *p=(int *)0x1234 = 10; //0x1234 is the memory address and value 10 is assigned in that address
unsigned int *ptr=(unsigned int *)0x903jf = 20;//0x903j is memory address and value 20 is assigned
Grundsätzlich verwenden wir in der Embedded-Plattform direkt Adressen anstelle von Namen
-
Schreiben: int *p=(int *)0x1234 = 10; ist für einige Compiler nicht legal. Sie müssen in zwei Anweisungen aufteilen: int *p=(int *)0x1234; * p = 10;
– Phil
6. November 2019 um 22:36 Uhr
-
Ganz zu schweigen davon, dass Sie zufälligen Speicheradressen keine Werte zuweisen können, die Ihr Programm nicht “besitzt”. Wenn Sie versuchen, auf den Wert einer Speicheradresse zuzugreifen (Lesen oder Schreiben), wird das Programm wahrscheinlich geschlossen. Das Betriebssystem verbietet es Ihnen. Dadurch blockiert das Betriebssystem bösartige Programme daran, den Speicher zu ändern, was zu schädlichen Fehlern führen könnte.
– Der Schlamm
21. Februar 2020 um 12:17 Uhr
-
@Themud, du hast Recht, du kannst bekommen
Segmentation fault (core dumped)
nur durch den Versuch, den Speicher eines anderen Programms zu lesen.– Smeterlink
29. April 2020 um 18:06 Uhr
Angenommen, Sie möchten, dass ein Zeiger auf die Adresse 0x28ff4402 zeigt, der übliche Weg ist
uint32_t *ptr;
ptr = (uint32_t*) 0x28ff4402 //type-casting the address value to uint32_t pointer
*ptr |= (1<<13) | (1<<10); //access the address how ever you want
Der kurze Weg ist also, ein MAKRO zu verwenden,
#define ptr *(uint32_t *) (0x28ff4402)
Unnötig zu erwähnen, dass dies eine ziemlich sinnlose – wenn nicht sogar selbstmörderische – Übung ist, außer vielleicht in bestimmten eingebetteten Systemen.
– Benutzer395760
25. Dezember 2010 um 22:58 Uhr
Dann müssen Sie den Segmentierungsfehler lieben.
– Indra
26. August 2014 um 12:09 Uhr
@IndrajithIndraprastham Ja, das ist lange her und ich war neugierig auf dieses Zeug
– Irakli
26. August 2014 um 14:35 Uhr
@Irakli: Ja, ich weiß, es war 3 Jahre zurück. Heute habe ich es ausprobiert und einen Segmentierungsfehler erhalten. Ich habe versucht, den Wert einer in einem Programm zugewiesenen Ganzzahl mit einem anderen zu ändern.
– Indra
26. August 2014 um 17:50 Uhr