Pointer frage zur initialisierung (kurzes beispiel)



  • #include <iostream>
    using namespace std;
    
    void eingabe(int *k)
    {
    
        cin >> *k ;
        return;
    
    }
    
    int main()
    {
    
        int i, f=1, x=0;
        int *k;
        
    
    
        eingabe(k);
        i = *k;
    
        cout << i + f << endl;
    
    
        return 0;
    
    }
    
    Programm läuft bei mir aber hängt sich dann auf. Ich weiß dass der pointer k eine zufällige speicheradresse bekommt weil es nicht initialisiert ist aber es müsste doch trotzdem klappen? In vielen online guides werden pointer auch nicht sofort initialisiert.

  • Mod

    Deine Annahme ist halt falsch. Wieso sollte es klappen, wenn man einfach irgendeine Mülladresse anspricht?

    Lern nicht aus gammeligen Online-Tutorials. Ich habe noch nie ein gutes gesehen. Pointer in C++ sind für Anfänger sowieso suspekt, da du sie im Leben nie (in dieser Form) brauchen wirst.



  • #include <iostream>
    using namespace std;
    
    void eingabe(int *k)
    {
    
        cin >> *k ;
        return;
    
    }
    
    int main()
    {
    
        int i, f=2, x=1;
        int *k=&x;
    
    
    
    
        eingabe(k);
        i = *k;
    
        cout << i + f << endl;
    
    
        return 0;
    
    }
    
    

    Mit dieser kleinen Änderung klappt es aber ich wollte herausfinden ob man es noch besser lösen kann mit einer anderen Methode da ich denke dass die Zeile 16 int *k=&x; nicht ganz optimal ist da man noch eine andere Variable braucht (x).
    Kann man einen Pointer eine sichere Speicheradresse geben ohne selber eine Variable zu deklarieren?



  • @tom678323 sagte in Pointer frage zur initialisierung (kurzes beispiel):
    Ich habe den Programmcode mal sinnvoll verändert. In so einem Fall kann man eine Referenz nutzen, und man sollte das auch in der Regel auch so tun. An dieser Stelle im Code gibt es keinen Grund einen Zeiger zu nutzen.

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    // sinnvoll ist in solchen Fällen eine Referenz.
    void eingabe (int& k)  {
       cin >> k;
    
       return;
    }
    
    int main () {
       int i, f=1;
       int k;
    
       eingabe(k);
       i = k;
    
       cout << i + f << endl;
    
       return EXIT_SUCCESS;
    }
    

    Programm läuft bei mir aber hängt sich dann auf. Ich weiß dass der pointer k eine zufällige speicheradresse bekommt weil es nicht initialisiert ist aber es müsste doch trotzdem klappen? In vielen online guides werden pointer auch nicht sofort initialisiert.

    Warum sollte es klappen, wenn der Zeiger ins Nirwana verweist? Dein Programm hat UB (undefined behavior) und da kann alles mögliche passieren.

    Nachtrag: Nochmals mit cut&paste den Code hineinkopiert. Das lässt sich übersetzen mit (Linux GCC 7.5.x)

    g++ -Wall -pedantic -Wextra -std=c++17 pointer.cc -o pointer
    


  • @tom678323 sagte in Pointer frage zur initialisierung (kurzes beispiel):

    Kann man einen Pointer eine sichere Speicheradresse geben ohne selber eine Variable zu deklarieren?

    Du kannst einem Pointer eine Adresse einer existierenden Variable übergeben (bei Dir ist das x), oder Du weist den Pointer die Adresse von alloziertem Speicher auf dem Heap zu. D.h. Du nutzt new o.ä., an dieser Stelle ist das aber unsinnig und sollte tunlichst unterlassen werden. Solange Du nicht anfängst alte C-APIs zu nutzen, oder einen Container selbst implementierst, besteht in C++ mittlerweile keine Notwendigkeit mehr mit rohen Zeiger zu hantieren. Lass es also sein.



  • @john-0 sagte in Pointer frage zur initialisierung (kurzes beispiel):

    eingabe (k);

    eingabe (k); / error beim compiler
    

    bei Johns code. Meintest du nicht eher eingabe(*k)



  • Nein tut er nicht.
    Error Meldung immer dazu schreiben.



  • cannot bind rvalue '(int)k' to 'int&'|

    Wenn ich es als eingabe(*k); schreibe funktioniert es aber mit eingabe(k) so wie du es hast john kommt der error



  • @tom678323 sagte in Pointer frage zur initialisierung (kurzes beispiel):

    bei Johns code. Meintest du nicht eher eingabe(*k)

    Definitiv nicht! In der Funktionsdefinition ist eine Referenz definiert, und diese wird nur mit dem Variablennamen benutzt. Sollte Dein Tutorial kein Abschnitt über Referenzen haben, taugt es definitiv nichts. Besorg Dir lieber eines der hier schon häufiger empfohlenen Bücher.



  • @tom678323 Ich würde vermuten, dass du nicht alles kopiert hast und deine Pointer Initialisierung noch da stehen hast.



  • @tom678323 sagte in Pointer frage zur initialisierung (kurzes beispiel):

    ob man es noch besser lösen kann

    Indem du als C++ler die Finger von Zeigern lässt.


Log in to reply