Speicheradresse auslesen
-
Hi Leute,
ich versuch mir gerade etwas c++ beizubringen. Zur Zeit lern ich etwas
über Zeiger. Hab das Prinzip denk ich soweit verstanden.Nun möchte ich Speicheradressen auslesen. Sprich ich gebe einer PointerVariablen
(z.B. *ptr) eine Adresse, und sie zeigt mir an, was da drin steht. Problematik:
ich kann ja nicht vorher wissen, was für ein Datentyp sie haben muss.greetz JohnC
-
Es klappt noch nichtmal, wenn ich weiß welcher Datentyp es ist. Programm sturzt ab.
int main()
{
int A;
int* a = &A;
int* test;A=169;
*test = *a;cout << test << endl;
};
-
Unter modernen Betriebssystemen kannst du nicht einfach auf irgendwelche Speicheradressen zugreifen.
Wozu brauchst du das überhaupt?
-
Ich will einfach etwas rumspielen. Hab nen Zweitpc, BS kann ruhig schrott gehen.
kann man das irgendwie umgehen?
greetz JohnC.
-
test und a sind beides zeiger!
test = a sollte gehen!
*test wäre eine dereferenzierung (zugriff auf den inhalt der in der speicheradresse von test gespeichert ist)
cout<<test gibt adresse aus, cout<<*test gibt 169 aus!
-
JohnC schrieb:
Hab nen Zweitpc, BS kann ruhig schrott gehen.
Das ist deine Meinung, aber das Betriebssystem dürfte das etwas anders sehen
(und deshalb schützt es sich selber, indem es Zugriffe auf Fremdspeicher abblockt)
-
du weist A die adresse 169 zu und das ist intern von windows geschützt
das gehts zwar aber in dre nächsten zeile versuchst du auf den inhalt der adresse
zu greifen und das geht nicht !!wenn du üben willst dann mach einfach sowas
int *a=NULL,b=5,*a=&b; cout<<*a;//inhalt von b cout<<a;//adresse von b
-
@oh je pointer:
ich weise der Var A den Wert 169 zu.
Find ich schade, dass das nicht klappt.
Hab zum Beispile immer nen Absturz mit Verweis auf 0x000000A oder E oder 7F. Würd da zum Beispiel gern mal gucken, auch wenn es mir nichts bringt, aber diese Abstürze bringen mich echt zum verzweifeln.thx für eure Antworten
greetz John
-
Dann schnapp dir einen Compiler und lass den das Programm ansehen.
PS: Viel interesanter als die Frage, was hinter 0x0000000A steht, ist: Wieso zeigt dein Pointer auf diese Adresse?
-
sorry, ich meinte kein Programm von mir, sondern jegliche Spiele, und manchmal auch bei musikanwendungen (Recording).
Ich glaub es liegt an den IRQ da sich RecKarte, Graka und netzwerkkarte einen teilen. Kann IRQ-sharing bei meinem Mainboard nicht ausschalten.Aber das gehört her nicht her!
greetz johnC.
-
-
JohnC schrieb:
Es klappt noch nichtmal, wenn ich weiß welcher Datentyp es ist. Programm sturzt ab.
int main()
{
int A;
int* a = &A;
int* test;A=169;
*test = *a;cout << test << endl;
};weiss nicht ob das hier scho wo geschrieben wurde oder ob ichs grad verplant hab, aber er kann doch kein wert in test schreiebn, weil test auf eine unbekannten speicheradresse zeigt?
mfg blan
-
*Test deklariere ich ja am anfang, und weise ihr duch *a die Speicherdresse von A zu.
greetz JohnC
-
Du weist 'test' überhaupt nichts zu - du dereferenzierst es nur und versuchst dem dahinterstehenden Speicherbereich etwas zuzuweisen. (das ist ein GROSSER Unterschied)
-
Cstoll hats besser erklaert -.-
-
achso,
*test hat also schon eine Adresse und durch
*test=*a veruche ich auf diese Adresse zuzugreifen.greetz
-
'test' ist ein Pointer, d.h. da steht eine Speicheradresse drin (und solange du nicht explizit etwas zuweist, hat der willkürlichen Inhalt). Mit '*test' dereferenzierst du diesen Pointer - und greifst auf die Daten zu, die an der in test gespeicherten Adresse im Speicher liegen.
Und da Windows deinem Programm nur einen bestimmten Speicherbereich genehmigt (und alle Zugriffe außerhalb dieses Bereichs verhindert), führt ein '*test=...' bei einem nicht initialisiertem Zeiger mit recht hoher Wahrscheinlichkeit zu einem Crash.
PS: Vielleicht solltest du dich mal mit diesem Artikel beschäftigen, bevor du weiter versuchst, deinen Prozessor bzw. RAM zu pulverisieren:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-124532
-
jo, danke dir, etwas kompliziert das ganze, aber wenn man das stück für stück durcharbeitet, macht alles einen sinn ^^
greetz JohnC
-
ein bisschen OT, will das Forum nciht mit Threads zu müllen.
versuche gerade ein Langzahlenaddition zu schreiben. Später möchte ich Subtraktion
division, multiplikation sowie modulo und evtl wurzel hinzufügen.Der Gedanke:
- die Zahlen werden in Strings gespeichert
- vno hinten nach vorne werden alle 3 Zeichen, in Integer umgewandelt
- Integer werden addiert
- Integer kommen an richtiger stelle in ein ErgebnisStringallerdings scheitere ich leider schon daran, die Strings in Integer umzuwandeln.
Die Zeichen einelt umzuwandeln mit 'at' würde ein zu hoehen leistungsverlust bedeuten. Ich hab aber keine funktion gefunden, bei der ich gruppenweise Zeichen in einem String ansrpechen kann. z.B. Str.holraus[a-b];hab die Strings in dynamische arrays gepseichert, bringt mir aber ncihts, gleiches Problem
greetz JohnC.
-
#include<iostream> // fuer ein/ausgabe #include<string> // fuer stl-strings #include<stdlib> // fuer strtol() using namespace std; int main () { string str="1234"; long val=strtol(str.c_str(),0,10); cout<<"str=="<<str<<endl; cout<<"val=="<<val<<endl; return 0; }
mit der funktion strtol() kannst du char-arrays (also c-strings) in eine int-zahl umwandeln. und mit der c_str()-methode bekommst du den inhalt eines stl-strings als char-pointer.
strtol():
http://www.cppreference.com/stdstring/strtol.htmlmit strtod() kannst du das selbe anstatt mit ints auch mit fießkommazahlen machen:
http://www.cppreference.com/stdstring/strtod.html