wo zeigt der Pointer hin?
-
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?
-
man kanns ein zu eins ins deutsche übersetzen. es bedeutet so viel wie 'darüber wird hier nix gesagt' und in dem von dir geposteten satz aus dem c-std wird eben gar nichts erzählt über das hochzählen eines null-pointers.
sorry, wegen spamsperre zerteilt.
-
aber schon witzig. obwohl der C-standard die sprache ziemlich genau beschreiben soll,
-
i-s-t e-s d-o-ch l-u-s-t-i-g, w-i-e v-ie-l ra-um die-ses doku-ment f-ür eig-ene
int-erp-ret-ationen lä--sst.
-
aber die spamsperre liess den text nicht anders durch
-
"undefined" bedeutet, daß der Standard nicht festlegt, was passieren soll - das sind Grenzfälle, die in die Hände des Compilers gelegt werden (und die man in normalen Programmen besser vermeiden sollte). "implementation defined" sind Details, bei denen der Standard Vorgaben macht, unter denen sich der Compiler eine aussuchen darf/muß (z.B. der Wertebereich von 'char').
(portabel kannst du dich auf keins von beidem verlassen - aber "implementation defined" Features führen normalerweise nicht zum Absturz)