Bestimmte Speicheradresse mit C schreiben/lesen

Gast #542932
Hallo,

ich werde wohl bald vor der Aufgabe stehen, in einem C-Programm eine 
bestimmte Speicheradresse lesen bzw. beschreiben zu müssen. Gibt es da 
eine Möglichkeit, einen Speicherbereich mit seiner Hex-Adresse 
anzusprechen, also quasi am Compiler/Linker vorbei? Oder muss ich auf 
Assembler zurückgreifen?

Hintergrund ist, dass an dieser Stelle eine FPGA-Regelung einen Wert 
ablegt.
Gast
Generell geht das seit anno 62 in C:

int *adresse = 0x1234;
int wert = *adresse;

Aber ob das auf deinem Mikro auch so ist, sagt mir meine Kristallkugel 
nicht.

Oliver
Gast
oliver:
Das hängt eher von seinem Compiler ab als von seinem "Mikro".
Aber meine Kristallkugel sagt mit 99,9 prozentiger Wahrscheinlichkeit 
sollte das klappen ;)
Gast
Hallo alle zusammen,
Ich hab schon viele Forume durchgesucht aber nix gefunden über 
Speicheradressen lesen in C#, und hier hab ich was gefunden aber halt in 
C wie man die Speicheradresse lesen kann, nun ist die frage ob man das 
auch in C# so benutzen kann.
Ich würde mich freuen wenn mir jemand sagen könnte wie man das machen 
könnte in C#.
Ich finde das Forum hier auch bis jetzt das Beste wo ich gefunden habe, 
hat sehr viele nütztliche Post's. Und es gibt hier viele Leute wo echt 
viel ahnung haben von ihrem Fach, das freut mich besonders.
Werde das so testen wie es hier weiter oben beschrieben ist:
int *adresse = 0x1234;
int wert = *adresse;
Ob es in C# geht.
Liebe grüsse von Sap
Gast
Danke Karl für die schnelle antwort.
Hab nun raus wie ich Speicheradresse lesen kann in C#.
Hier was ich getestet habe, vielleicht kann es ja dann später irgend wem 
helfen:
            unsafe
            {
                 // *i ist der Valor von der Speicheradresse
                 //  i ist die Speicheradresse

                int y = 7; // Speicheradresse ist: 69133040
                int x = 4; // Speicheradresse ist: 69133036
                int *i = (int*)69133036;
               // int* i = &x; zum sehn welche Speicheradresse x hat
                int aux = (int)*i; // ergebnis wäre 4
               // int aux = (int)i; // ergebnis wäre Speicheradresse
                MessageBox.Show(aux.ToString());
            }
Die Speicheradresse kann verschieden sein bei jedem.
entweder verstehe ich das falsch, oder die antworten sind alle nicht auf 
die überschrifft bezogen

er fragt ja auch, wie er einen wert an eine bestimmte Adresse schreiben 
kann.

Würde mich nämlich auch interessieren, wie das geht ;-)
MfG Patrick
Patrick S. schrieb:
> entweder verstehe ich das falsch, oder die antworten sind alle nicht auf
> die überschrifft bezogen

Du verstehst das dann falsch. Bis auf die letzten 3 (die das ganez unter 
C# behandeln) sind alle Antworten 'on topic'

> er fragt ja auch, wie er einen wert an eine bestimmte Adresse schreiben
> kann.
>
> Würde mich nämlich auch interessieren, wie das geht ;-)

Du nimmst die Adresse als Zahl, castest sie in einen Pointer um und 
greifst über den Pointer zu.
Gast
Hallo zusammen,

bei mir funktioniert folgendes:

int *iAddress = reinterpret_cast<int*>(0x1234);

aber mit float funktioniert es nicht:

float *fAddress = reinterpret_cast<float*>(0x1234);

Hat jemand eine idee?
Gast
Danke für die Antwort!

Error ist folgender: Invalid Cast from type 'float' to type 'float*',


programmiert hab ich es mit dem QT Creator , compiler: mingw, 
Betriebssystem: Windows XP
Gast
Ok, was ich geschrieben hab stimmt so nicht, die von mir oben genannten 
beispiele funktionieren, den fehler bekomme ich nur bei folgender Zeile:

float *fAddress = reinterpret_cast<float*>(sAddress.toFloat());

int *iAddress = reinterpret_cast<int*>(sAddress.toInt()); <-- wird 
richtig compiliert

sAddress ist ein QString.
Bash_s schrieb:
> Ok, was ich geschrieben hab stimmt so nicht, die von mir oben genannten
> beispiele funktionieren, den fehler bekomme ich nur bei folgender Zeile:
>
> float *fAddress = reinterpret_cast<float*>(sAddress.toFloat());

toFloat() liefert einen float?


Na ja, was erwartest du, wie soll man aus einem Float (warum eigentlicgh 
float?) eine Adresse machen?  Welches ist denn das 2.5 te Byte?

Ich denke du machst einen Fehler. Im Speicher liegt an dieser Adresse 
ein float. Aber deswegen ist ja die Adresse selber kein float! Eine 
Adresse ist immer eine ganze Zahl. Du musst unterscheiden zwischen der 
Adresse selber und dem was unter dieser Adresse im Speicher zu finden 
ist. Das eine hat mit dem anderen insofern nix zu tun, als eine Adresse 
einfach nur eine ganze Zahl ist. Wenn ich dann diese Zahl hernehme und 
mir die Bytes von dieser Speicheradresse hole, dann kann ich mit diesen 
Bytes einen float bilden. Aber deswegen ist ja eine Adresse kein float.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.