Objekt auf Adresse überprüfen
-
Hi,
ich will einfach nur ein Objekt auf eine bestimmt Adresse abfragen. Und zwar ab das Objekt bereits "initialisiert" ist.
if(objekt != 0xcdcdcdcd)error C2040: '!=' : 'objekt *' unterscheidet sich von 'unsigned int' in Bezug auf die Anzahl vorgenommener DereferenzierungenSteh voll auf dem Schlauch... ich weiß aber, dass ich sowas Ähnliches schon gemacht habe.
Grüße
-
Initialisier deinen Zeiger ordentlich mit 0 und prüf darauf.
-
ich weiß, daran hab ich auch schon gedacht.
Aber wie funktioniert eine Abfrage auf eine Adresse grundsätzlich
Danke für die schnelle Antwort
-
du musst deine adresse von unsigned int in einen zeiger auf dein object casten, aber wegen dem hier u.a. http://en.wikipedia.org/wiki/Address_space_layout_randomization macht dein vergleich keinen sinn.
ab c++0x gibt es das schlüsselwort nullptr, dass man anstelle von NULL benutzten kann für zeiger.
-
rubooo schrieb:
ich will einfach nur ein Objekt auf eine bestimmt Adresse abfragen.
Mir ist die Bedeutung dieses Satzes nicht klar.
rubooo schrieb:
Und zwar ab das Objekt bereits "initialisiert" ist.
Objekte sind, wenn es keine POD-Objekte sind, immer "initialisiert". Ansonnsten kann da auch Müll drin stehen, in welchem Fall nur ein schreibender Zugriff darauf "legal" ist (*). Mit "legal" meine ich hier all das, was nicht undefiniertes Verhalten hervor rufen würde. Du müsstest Dir also in einer separaten Variable merken, ob Du auf ein bestimmtes Objekt auch lesend zugreifen darfst oder nicht, wenn es nicht vom Design her schon klar ist.
(* ausgenommen bei unsigned char, meines Wissens nach, ist aber nicht so wichtig hier )
rubooo schrieb:
if(objekt != 0xcdcdcdcd)error C2040: '!=' : 'objekt *' unterscheidet sich von 'unsigned int' in Bezug auf die Anzahl vorgenommener DereferenzierungenAuf was sich
objektin dem Beispiel bezieht, ist mir nicht klar. Dazu hast Du einfach zu viel an Information vorenthalten.
-
Ich meine mich zu Erinnern, das 0xcdcdcdcd unter Windows ein besonderer Wert war. (Für unintialiserte Zeiger)
krümelkacker schrieb:
(* ausgenommen bei unsigned char, meines Wissens nach, ist aber nicht so wichtig hier )
Was passiert, wenn man von einem uninitialisierten unsigned char liest? Welchen Wert bekommt man dann?
-
pyhax schrieb:
Was passiert, wenn man von einem uninitialisierten unsigned char liest? Welchen Wert bekommt man dann?
Das Verhalten ist (meines Wissens nach) definiert, aber der Wert immer noch unspezifiziert. Zumindest leite ich das daraus ab, dass man per Lvalue vom Typ unsigned char andere PODs "untersuchen" darf, also alle möglichen Bitkombinationen bei unsigned char eine gültige Kodierung eines Wertes darstellen, wohingegen bestimmte Bitkombinationen für andere Typen ungültig sein könnten ("trap representation").
-
krümelkacker schrieb:
Das Verhalten ist (meines Wissens nach) definiert, aber der Wert immer noch unspezifiziert.
Ich denke nicht.
n3242 4.1 Lvalue-to-rvalue conversion / 1 schrieb:
A glvalue (3.10) of a non-function, non-array type T can be converted to a prvalue.53 If T is an incomplete
type, a program that necessitates this conversion is ill-formed. If the object to which the glvalue refers is not
an object of type T and is not an object of a type derived from T, or if the object is uninitialized, a program
that necessitates this conversion has undefined behavior. If T is a non-class type, the type of the prvalue is
the cv-unqualified version of T. Otherwise, the type of the prvalue is T.54@pyhax
Der VS Debugger initialisiert alles uninitialisierte mit 0xcdcdcdcd.