Fragen bezüglich des Pointer-"Datentyps" und malloc



  • Hallo allesamt,
    Das ist hier mein erster Beitrag, ich hoffe ich frage keine schon hundertfach geklärte Frage, jedoch war ich nicht fähig, selbst die Lösung herauszufinden.

    Ein Pointer braucht den Datentyp um zu wissen, wie weit er im Speicher springen muss, wenn man ihn inkrementiert (Das mein aktueller stand). Die Funktion malloc nun liefert mir einen VOID-Pointer zurück. Ist es nun nicht so, dass der VOID-Pointer auch nur die Adresse des Startplatzes beinhaltet? Wenn dem so sei, wieso muss ich nun den VOID-Pointer in einen von mir genutzten Datentyp umwandeln (z.b. int*)? Ist es nicht so, dass ich meinem Pointer nun nicht einfach die Startadresse ohne cast zuweisen kann? Wie weit er springen muss weiß mein Pointer doch?

    Ich hoffe die Frage ist verständlich gestellt. Vielen dank für das Lesen schonmal 🙂

    Grüße



  • Der Compiler muss auch wissen, wie der Speicher behandeln werden soll, auf den der Zeiger verweist.
    (steht da ein double oder long oder char oder ...)

    In C musst du den Rückgabewert von malloc nicht casten, da ein void* in jeden anderen Datenzeiger konvertierbar ist. (In C++ musst du den cast machen).



  • Ok in meiner Literatur wird immer ein cast angewendet (kein c++).

    Der Compiler weiß doch, dass wenn mein Pointer z.b. vom Datentyp int* ist, und ich ihm eine Adresse gebe, wie er weiterspringen muss, deshalb war meine Frage, wieso ich dann eine Adresse (malloc gibt doch nur eine Adresse zurück?) in den passenden Datentyp casten soll, wenn ich ihm diese zuweisen möchte.

    Wie schon gesagt, der Compiler erkennt doch automatisch am Datentyp von meinem Pointer, wie er springen muss?

    Oder anders gefragt, was würde ein cast am rückgabewert von malloc ändern? Da es doch eine Adresse ist, kann er die ja nicht verändern, oder steht da etwa eine Information über die "Sprungweite" drin, die man casten muss?



  • Jetzt verstehe ich, wieso ich immer rechnen musste beim schreiben eines Beitrages 😃 sollte mich natürlich auch einloggen (Also ich bin Steggesepp).

    Ich wollte die Frage eventuell ncohmal anders Formulieren. Wenn ich eine DOUBLE* Adresse zu einem INT* zuweisen will, wieso müsste man da casten? Ich weiße dem anderen Pointer doch nur die "Startadresse" zu, wie weit er dabei dann im Speicher lesen muss ist dem ja selbst überlassen?

    In dem Falle würde meiner Vermutung nach der Wert des INT* pointers einfach die ersten 4 Bytes des DOUBLE*-Wertes sein?


  • Mod

    Das musst du casten, weil int und double inkompatibel sind. Das heißt, wenn man anfängt einen int* wie einen double* zu behandeln, dann würde man in der Folge die dahinter zu vermutenden int-Daten wie double-Daten behandeln. Das ist keine sinnvolle Operation, deswegen wird das erst einmal als Fehler betrachtet. Durch den Cast sagst du dem Compiler, dass du, der Programmierer, ganz sicher bist, dass diese Operation so in Ordnung geht. Dann erzeugt er auch ohne Fehlermeldung den zugehörigen Code, der die Daten wie double behandelt.



  • Es ist selten sinnvoll nicht-void-Zeiger in andere nicht-void-Zeiger zu wandeln.

    Wenn es doch nötig ist, sagst du dem Compiler mit dem cast: "Das ist in Ordnung, ich weiß was ich tue."
    Hoffentlich stimmt dann auch die Aussage. Vor allem der zweite Teil.



  • Danke euch schonmal, das bedeutet, das bedeutet, dass unabhängig welchen Datentyp ich habe, der Adresswert eines Pointers bei jedem Datentyp gleich ist, sofern er auf die gleiche Speicherstelle zugreift, deshalb ist es auch bei malloc kein problem einen void-pointer einfach so in einen int pointer zuzuweisen (zumindest in c)

    [e] es geht mir bei der frage generell nicht um sinnvoll oder sinnlos, eher um das verständnis was dahinter abläuft.



  • Im Prinzip schon.

    Aber es gibt noch die harte Realität.
    Manche Prozessoren können nur auf Speicherstellen zugreifen, die ganzzahlige Vielfache von der Größe des Datentyps sind.
    Wenn ein short aus 2 Byte besteht (sizeof(short)=2), dann kann der Prozessor short-Werte nur von geraden Adressen holen. Das nennt man Alignement

    Dadurch ist es nicht unbedingt möglich, von jeder Adresse jeden Datentyp zu lesen.



  • Ah danke das ist ein guter hinweis mit dem alignment!


Anmelden zum Antworten