Datenlöschen trotz Pointer



  • Wenn ich einen globalen Pointer auf eine Struktur zeigen lasse, die am blockende "vernichtet" wird, bleibt mir der Inhalt doch erhalten?



  • nein



  • hab ne Struktur

    typdef struct
    {
    .
    .
    .
    double* wert
    }bewegung;
    

    dann einen Pointer

    bewegung* test;
    

    ich möchte gern einen wert auf "wert" einlesen. warum funktioniert folgender code nicht (fehler zur laufzweit).

    test=malloc(sizeof(bewegung));
    test->wert=malloc(sizeof(double));
    scanf("%lf", &(test->wert));
    


  • printf("%x", &(test->wert));
    printf("%x", test->wert);
    

    liefern jeweils die selbe adresse. warum gehts trotzdem nicht.



  • scanf("%lf", &(*test->wert));
    

    Wow, fünf mal bearbeitet... mein Rekord.
    Und trotzdem, ich kanns nicht erklären... 🙄
    Das lass ich mal die Profis erledigen.



  • wert ist kein String sonder ein double wert. da kannst du mit sscanf lesen bist du schwarz bist. die angabe des pointers hilft da ein scheiss.



  • 'test->wert' ist selber schon ein pointer d.h. man braucht bei scanf keinen adress-operator '&'

    scanf("%lf", test->wert);     
        printf ("%lf", *test->wert);
    


  • Ich würds ja so machen:

    typdef struct
    {
      .
      .
      .
      double wert; /* Semikolon nicht vergessen */
    } bewegung;
    
    bewegung test; /* Direkt das struct global anlegen - dann bleibts dir auch erhalten, und du musst dich nicht um die Speicherfreigabe kümmern */
    
    /* ... zum Beispiel: ... */
    
    int main(void) {
      scanf("%lf", &test.wert);
      printf("%lf\n", test.wert * test.wert);
    
      return 0;
    }
    


  • [=] schrieb:

    wert ist kein String sonder ein double wert. da kannst du mit sscanf lesen bist du schwarz bist. die angabe des pointers hilft da ein scheiss.

    Käse.



  • 0xdeadbeef schrieb:

    Ich würds ja so machen:

    typdef struct
    {
      .
      .
      .
      double wert; /* Semikolon nicht vergessen */
    } bewegung;
    
    bewegung test; /* Direkt das struct global anlegen - dann bleibts dir auch erhalten, und du musst dich nicht um die Speicherfreigabe kümmern */
    
    /* ... zum Beispiel: ... */
    
    int main(void) {
      scanf("%lf", &test.wert);
      printf("%lf\n", test.wert * test.wert);
    
      return 0;
    }
    

    So hätte ich das auch gemacht, jedoch muss ich die Daten in eine verkettete Liste einhängen und da nützt mir eine temporäre Struktur wenig. Deshalb musste ich einen globalen Pointer verweden.

    Ich hab aber das Problem lösen können!

    scanf("%lf", &(*test->wert));
    

    funktioniert prima!

    Dagegen gab es mit

    scanf("%lf", test->wert);
    

    Probleme.

    Dank euch für eure Hilfe!
    Schönes Wochenende noch. 🕶



  • Richard schrieb:

    scanf("%lf", &(*test->wert));
    

    funktioniert prima!
    Dagegen gab es mit

    scanf("%lf", test->wert);
    

    Probleme.

    komisch, das &* sollte sich doch aufheben, oder hab' ich was mit den klammern nicht verstanden?



  • net schrieb:

    komisch, das &* sollte sich doch aufheben, oder hab' ich was mit den klammern nicht verstanden?

    Nein, das hast du schon richtig verstanden.
    Keine Ahnung warum Richard schreibt, dass das eine funktioniert und das andere nicht. Ich glaube, er interpretiert nur irgendwas falsch. Entweder funktionieren beide Varianten oder keine.



  • Tja, ich sehe das genauso wie ihr. Für mich ist das auch dasselbe, nur hat das leider zu einem Fehler bei der Laufzeit geführt...

    scanf("%lf", test->wert);
    

    und das halt nicht:

    scanf("%lf", &(*test->wert));
    

    😕

    Ich hätte auch lieber die "logische" Variante bevorzugt, aber am Ende war halt wichtig, dass es läuft! :p



  • Richard schrieb:

    Tja, ich sehe das genauso wie ihr. Für mich ist das auch dasselbe, nur hat das leider zu einem Fehler bei der Laufzeit geführt...

    Welchen Fehler hast du denn genau?

    Richard schrieb:

    Ich hätte auch lieber die "logische" Variante bevorzugt, aber am Ende war halt wichtig, dass es läuft! :p

    Ja, auf deinem Rechner. Solang du die Sache aber nicht geklärt hast, kann das auf einem anderen Rechner aber anders aussehen.
    Hab jetzt jedenfalls beide Varianten mal ausprobiert und funktioniert problemlos. Der Compiler generiert auch erwartungsgemäss den gleichen Assemblercode. Bei dir muss also noch irgendwas anderen im Argen liegen. Vielleicht hat auch dein Compiler 'ne Macke.


Anmelden zum Antworten