wo zeigt der Pointer hin?
-
Hallo,
was bedeutet genau diese codezeile:
ptr_to_struct = (structname *) 0
(ein Pointer der Struktur structname = (Name der Struktur *)0 )
Wo zeigt jetzt der Pointer der Struktur hin - ist das ein normaler Nullzeiger?
Hans
-
neuerName schrieb:
Wo zeigt jetzt der Pointer der Struktur hin - ist das ein normaler Nullzeiger?
nein, er zeigt auf die Adresse 0. NULL muss nicht zwangsläufig auf die Adresse 0 zeigen.
-
ist das ein normaler Nullzeiger?
Ja, aber der Compiler sollte von da an die Zeigerarithmetik verstehen, falls der Pointer als void* definiert war.
TYPE *a = NULL; // jetzt macht a++ Sinn void *b = (TYPE*)0; // da macht b++ Sinn void *c = NULL; // c++ kann keinen Sinn machen, weil der Compiler es nicht versteht // (o würden mir nur öfter solche Sätze einfallen!)
EDIT:
nein, er zeigt auf die Adresse 0. NULL muss nicht zwangsläufig auf die Adresse 0 zeigen.
Auch wieder wahr.
-
Bei dem Pointer handelt es sich nicht um einen void Pointer sondern um einen Pointer einer Struktur (der sozusagen auf diese struktur auch zeigt).
struct name *pointer;
d.h. mit pointer = (name *)0 zeigt dieser auf das erste element der struktur (also den kopf)?
Hans
-
cheopz schrieb:
ist das ein normaler Nullzeiger?
Ja, aber der Compiler sollte von da an die Zeigerarithmetik verstehen, falls der Pointer als void* definiert war.
TYPE *a = NULL; // jetzt macht a++ Sinn void *b = (TYPE*)0; // da macht b++ Sinn void *c = NULL; // c++ kann keinen Sinn machen, weil der Compiler es nicht versteht // (o würden mir nur öfter solche Sätze einfallen!)
1. Es gibt keine Zeigerarithmetik mit void-Zeigern, da void als unvollständiger Datentyp keine definierte Größe hat, es also unklar ist, um wieviele Bytes ein ++ den Pointer weitersetzen soll. Der gcc kann das als Erweiterung. Nehmen wir im Folgenden an, deine Beispiele wären mit char* statt void*.
2. Einen Nullzeiger zu inkrementieren führt zu zu undefiniertem Verhalten.
3. b und c haben denselben Typ und denselben Wert, also warum sollte ++ einmal gehen und einmal nicht?
-
supertux schrieb:
nein, er zeigt auf die Adresse 0. NULL muss nicht zwangsläufig auf die Adresse 0 zeigen.
Doch, es ist ein Nullzeiger.
-
Bashar schrieb:
supertux schrieb:
nein, er zeigt auf die Adresse 0. NULL muss nicht zwangsläufig auf die Adresse 0 zeigen.
Doch, es ist ein Nullzeiger.
es ist aber nicht definiert, dass NULL der 0 Adresse entsprechen muss. Es kann auch gut 0xdeadbeef sein (kann mich nicht erinnern, dass im Standard eine Definition für NULL gibt).
edit: http://en.wikipedia.org/wiki/Pointer#The_null_pointer : "A null pointer has a reserved value, often but not necessarily the value zero"
ich weiß, dass Wikipedia nicht immer richtig ist, aber das habe ich immer so gehört.
-
supertux schrieb:
Bashar schrieb:
supertux schrieb:
nein, er zeigt auf die Adresse 0. NULL muss nicht zwangsläufig auf die Adresse 0 zeigen.
Doch, es ist ein Nullzeiger.
es ist aber nicht definiert, dass NULL der 0 Adresse entsprechen muss.
Richtig, aber du hast es ja gerade andersrum behauptet, nämlich dass (structname*)0 die Adresse 0 und kein Nullzeiger sei, und das ist eben genau falsch. Es ist ein Nullzeiger, ob es die Adresse 0 ist weiß man nicht.
-
Bashar schrieb:
Richtig, aber du hast es ja gerade andersrum behauptet, nämlich dass (structname*)0 die Adresse 0 und kein Nullzeiger sei, und das ist eben genau falsch. Es ist ein Nullzeiger, ob es die Adresse 0 ist weiß man nicht.
Alles klar, hab den Unterschied bemerkt. Auf der Wiki Seite selber steht ja "ANSI C guarantees that any NULL pointer will be equal to 0 in a comparison with an integer type"
-
Vielleicht verständlicher formuliert, heisst das, dass die Ganzzahlkonstante '0' in einem entsprechenden Kontext immer zu einem Nullzeiger evaluiert. Egal welcher Adresswert einem Nullzeiger letztendlich entspricht.
-
Bashar schrieb:
2. Einen Nullzeiger zu inkrementieren führt zu zu undefiniertem Verhalten.
du meinst sowas:
int *p = (int*)0; p++; // zeigt jetzt auf die adresse 'sizeof(int)'
ist undefiniert?
-
Ja, Pointerarithmetik ist nur für Zeiger, die auf Objekte (bzw. eigentlich nur Arrays, aber ein einzelnes Objekt wird in dem Zusammenhang als Array der Länge 1 angesehen) zeigen, definiert.
-
Bashar schrieb:
Ja, Pointerarithmetik ist nur für Zeiger, die auf Objekte (bzw. eigentlich nur Arrays, aber ein einzelnes Objekt wird in dem Zusammenhang als Array der Länge 1 angesehen) zeigen, definiert.
naja, nun kann sich aber an der adresse 0 doch etwas sinnvolles befinden (wie z.b. bei ARM prozessoren eine vektortabelle aus acht 32-bit werten). im iso/iec steht z.b. das:
Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer,
schon mal dumm, aber dass inkrementieren von 0-pointern undefiniert ist, konnte ich dort nicht finden.
-
hab 0 plan vom 0 pointer schrieb:
naja, nun kann sich aber an der adresse 0 doch etwas sinnvolles befinden (wie z.b. bei ARM prozessoren eine vektortabelle aus acht 32-bit werten).
Ja.
im iso/iec steht z.b. das:
Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer,
schon mal dumm, aber dass inkrementieren von 0-pointern undefiniert ist, konnte ich dort nicht finden.
Das steht beim + und - Operator.
-
Bashar schrieb:
Das steht beim + und - Operator.
ich muss heute mit blindheit geschlagen sein. ich find's nicht
-
6.5.6 im c99 Draft, §8:
" If both the
pointer operand and the result point to elements of the same
array object, or one past the last element of the array
object, the evaluation shall not produce an overflow;
otherwise, the behavior is undefined."
Schwer zu finden, ich gebs zu.
-
Bashar schrieb:
6.5.6 im c99 Draft, §8:
" If both the
pointer operand and the result point to elements of the same
array object, or one past the last element of the array
object, the evaluation shall not produce an overflow;
otherwise, the behavior is undefined."
Schwer zu finden, ich gebs zu.na ich weiss nicht. diesen satz hatte ich auch schon unter verdacht, aber daraus undefiniertes verhalten beim hochzählen eines 0-pointers abzuleiten ist doch ziemlich weit hergeholt.
-
draft punk schrieb:
na ich weiss nicht. diesen satz hatte ich auch schon unter verdacht, aber daraus undefiniertes verhalten beim hochzählen eines 0-pointers abzuleiten ist doch ziemlich weit hergeholt.
Bashar schrieb:
"If both the pointer operand [...] point to [...]"
Nicht erfüllt (Nullzeiger "don't point to"), ergo otherwise, ergo undefined. Wieso ist das weit hergeholt?
-
LordJaxom schrieb:
Bashar schrieb:
"If both the pointer operand [...] point to [...]"
Nicht erfüllt (Nullzeiger "don't point to"), ergo otherwise, ergo undefined. Wieso ist das weit hergeholt?
na deshalb, beispiel:
uint32_t *arm_vector_table = (uint32_t*)0; // hier befindet sich ein array mit einigen 32-bit werten arm_vector_table++; // zeigt jetzt auf den 'unknown instruction vector'
das klappt, ist bestenfalls 'implementation defined'
-
Du verstehst einfach den Begriff undefined nicht, das ist alles.
-
was gibts da nicht zu verstehen?