Wie kann ich die Zeigeradresse in der Programmiersprache C manuell zuweisen?

Lesezeit: 4 Minuten

Benutzeravatar von Irakli
Irakli

Wie weisen Sie manuell eine Zeigeradresse zu (z. B. Speicheradresse 0x28ff44) in der Programmiersprache C?

  • 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

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

Benutzeravatar der zsalzbank
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.

kamals Benutzeravatar
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)

1414220cookie-checkWie kann ich die Zeigeradresse in der Programmiersprache C manuell zuweisen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy