int *p; p dereferenzieren: ist *p das selbe wie p[] und p[0]?



  • __fricky schrieb:

    ganz schön anmassend von den schreiberlingen des c-standards, davon auszugehen, dass an adresse 0 nix sinnvolles sein kann.
    🙂

    Aber nicht doch ficky, im Ansi C-Standard ist NULL nicht zwingend die Adresse 0, sondern eine architekturabhängige Bitkombination welche eine ungültige Adresse definiert.



  • ficky schrieb:

    im Ansi C-Standard ist NULL nicht zwingend die Adresse 0, sondern eine architekturabhängige Bitkombination welche eine ungültige Adresse definiert.

    und was ist, wenn alle adressen gültig sind?
    🙂


  • Mod

    __fricky schrieb:

    ficky schrieb:

    im Ansi C-Standard ist NULL nicht zwingend die Adresse 0, sondern eine architekturabhängige Bitkombination welche eine ungültige Adresse definiert.

    und was ist, wenn alle adressen gültig sind?
    🙂

    Selbstverständlich steht es einer Implementation frei, das Verhalten für Fälle, bei denen der Standard das offen lässt, explizit zu bestimmen.



  • Passend zum Thema: Mindestens ein Betriebssystem (HP-UX) hat an der Adresse 0x0 tatsächlich etwas gültiges stehen, und zwar ein Nullbyte.

    Was meint ihr wieviel (für andere Maschinen) broken Code geschrieben wurde, weil jemand davon ausging, strlen(s) für s == NULL wäre eine tolle Idee. Und solcher Code lief z.T. zwei Jahrzehnte.

    Aber das nur als Anekdote am Rande 🙂



  • __fricky schrieb:

    ficky schrieb:

    im Ansi C-Standard ist NULL nicht zwingend die Adresse 0, sondern eine architekturabhängige Bitkombination welche eine ungültige Adresse definiert.

    und was ist, wenn alle adressen gültig sind?
    🙂

    was wäre wenn... es ist nun mal so definiert, wieso sich mit unsinnigen Fragen beschäftigen?

    LordJaxom schrieb:

    Passend zum Thema: Mindestens ein Betriebssystem (HP-UX) hat an der Adresse 0x0 tatsächlich etwas gültiges stehen, und zwar ein Nullbyte.

    Was meint ihr wieviel (für andere Maschinen) broken Code geschrieben wurde, weil jemand davon ausging, strlen(s) für s == NULL wäre eine tolle Idee. Und solcher Code lief z.T. zwei Jahrzehnte.

    Aber das nur als Anekdote am Rande 🙂

    die ARM Architektur hat auf der Adresse 0 auch wichtige Information: die Adresse des reset-exception Handlers.



  • LordJaxom schrieb:

    Passend zum Thema: Mindestens ein Betriebssystem (HP-UX) hat an der Adresse 0x0 tatsächlich etwas gültiges stehen, und zwar ein Nullbyte.

    naja, aber das sollte kein grund sein, 0 als ungültigen pointer-wert zu erklären. wer liest schon ein byte, von dem er weiss, das es immer 0 ist?

    LordJaxom schrieb:

    Was meint ihr wieviel (für andere Maschinen) broken Code geschrieben wurde, weil jemand davon ausging, strlen(s) für s == NULL wäre eine tolle Idee. Und solcher Code lief z.T. zwei Jahrzehnte.

    ich z.b. verwende NULL nie, sondern schreibe immer 0. wahrscheinlich hab' ich deshalb auch viel 'broken code' erzeugt, bei dem besser NULL angebracht wäre.

    supertux schrieb:

    was wäre wenn... es ist nun mal so definiert, wieso sich mit unsinnigen Fragen beschäftigen?

    wieso unsinnig? es gibt viele systeme z.b. solche mit kleinem adressraum (16 bitter z.b.), die keine ungültigen adressen haben.

    supertux schrieb:

    die ARM Architektur hat auf der Adresse 0 auch wichtige Information: die Adresse des reset-exception Handlers.

    auf sowas wollte ich hinaus. aber dafür haben viele ARMs andere, ungültige adressbereiche, wo weder speicher noch peripherals sind. zugriffe darauf lösen prefetch- oder data-aborts auslösen. das wären eher kandidaten für einen ungültigen pointer-wert.
    🙂



  • fricky__ schrieb:

    LordJaxom schrieb:

    Passend zum Thema: Mindestens ein Betriebssystem (HP-UX) hat an der Adresse 0x0 tatsächlich etwas gültiges stehen, und zwar ein Nullbyte.

    naja, aber das sollte kein grund sein, 0 als ungültigen pointer-wert zu erklären. wer liest schon ein byte, von dem er weiss, das es immer 0 ist?

    (Ergänzung: Auf dieser Plattform ist NULL == 0)

    Laut irgendeinem älteren Dokument von HP, welches ich leider nicht mehr finde, war das absichtlich der Fall, damit ein Programmierer von der Notwendigkeit entlastet wird, jede String-Rückgabe auf NULL zu prüfen. Sprich, sowas wie strlen(getenv("...")) oder strcmp(getenv("..."), "") liefert bei NULL und "" das gleiche, gültige Ergebnis.

    Ob nun NULL oder 0, so ein Code ist auf vielen anderen Plattformen einfach kaputt.



  • Wie kommt ihr denn darauf, dass an Adresse 0 (oder an der Adresse, auf die der Nullzeiger zeigt) nichts gültiges stehen darf? Ein Nullzeiger ist ein Zeiger, der z.B. nie auf ein Objekt zeigt und der von malloc&Co. nur bei Misserfolg zurückgegeben wird.
    Dadurch sind Adressen, an denen irgendwelche Hardware-Register liegen, ja geradezu prädestiniert für Nullzeiger.

    ich z.b. verwende NULL nie, sondern schreibe immer 0. wahrscheinlich hab' ich deshalb auch viel 'broken code' erzeugt, bei dem besser NULL angebracht wäre.

    Quark, lies endlich mal den Standard.



  • Bashar schrieb:

    Wie kommt ihr denn darauf, dass an Adresse 0 (oder an der Adresse, auf die der Nullzeiger zeigt) nichts gültiges stehen darf?

    deswegen:

    Bashar schrieb:

    Ein Nullzeiger ist ein Zeiger, der z.B. nie auf ein Objekt zeigt...

    Bashar schrieb:

    ich z.b. verwende NULL nie, sondern schreibe immer 0. wahrscheinlich hab' ich deshalb auch viel 'broken code' erzeugt, bei dem besser NULL angebracht wäre.

    Quark, lies endlich mal den Standard.

    mache ich ja manchmal, aber ich vergesse auch wieder vieles.
    🙂



  • NULL-Zeiger != Zeiger auf die Adresse 0

    Was ist daran so verwirrend?

    Die wenigstens NULL Zeiger werden wirklich auf die Adresse 0x0 zeigen... idR zeigen NULL Zeiger auf eine adresse die garantiert immer eine access violation liefert wenn man sie lesen oder schreiben will...


Anmelden zum Antworten