C Zeiger

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo,
    ich habe eine Frage zu Zeigern. Ich poste mal meinen Code

    Quellcode

    1. int main() {
    2. int *ptr = malloc(2*sizeof(int));
    3. int a = 4;
    4. int b = 2;
    5. ptr = &a;
    6. ptr++;
    7. ptr = &b;
    8. printf("%d",*(ptr-1));
    9. return 0;
    10. }
    Alles anzeigen


    eigentlich müsste ich doch wieder 4 ausgegeben bekommen. Mir wird aber 4200656 ausgegeben.
    Wäre über Hilfe sehr dankbar
    Lisa
  • Hallo Lisa,
    so einfach kann man das nicht sagen, es kommt auch oft drauf an wie der Compiler den Code umsetzt.

    Quellcode

    1. int main() {
    2. // es werden 2*4=8 Bytes reserviert und die Speicheradresse in ptr gespeichert
    3. // (ggf. ist eine expliziete Typenkonventierung nötig da malloc einen void Zeiger zurück gibt)
    4. int *ptr = malloc(2*sizeof(int));
    5. int a = 4;
    6. int b = 2;
    7. // die zuvor reservierte Addresse wird hier mit der Addresse von a überschrieben
    8. // und damit kann nicht mehr auf den zuvor reservierten speicher Zugegriffen werden
    9. // es entsteht so ein sogenannter Speicherleak
    10. ptr = &a;
    11. // Die Adresse wird um eine Einheit inkrementiert, in C++ wird hierbei auf den Typ geachtet und
    12. // im Falle von int wird hier um 4 inkrementiert
    13. // Der Zeigt ptr zeigt jetzt auf eine unbekannte Variable auf dem Stack vor a, und das ist nicht b
    14. ptr++;
    15. // Wiederum wird die Addresse von b an ptr zugewiesen damit sind die vorherigen Operationen im Prinzip verworfen
    16. ptr = &b;
    17. // Die folgende Anweisung dekrementiert den ptr um eine Einheit (4 Bytes) und gibt den integer-Wert an der Position aus
    18. // dies ist aber auch nicht a
    19. printf("%d",*(ptr-1));
    20. return 0;
    21. }
    Alles anzeigen


    Wenn man sich die Addressen an der printf Position mal anschaut dann stellt man fest warum auch was anderes Ausgegeben wird (Beispiel):

    Quellcode

    1. &a -> 0x0032F790
    2. &b -> 0x0032F784
    3. ptr = &b;
    4. ptr-1 -> 0x0032F780


    Mfg Rushh0ur