Pointer-Problem...



  • Hallo,

    ich habe da ein Problem: Eine Variable (vom Typ einer Pointer-auf-struct) wird mit NULL initialisiert und soll nun von einer anderen Funktion einen Wert zugewiesen kriegen. Als Beispiel zur Illustration des Problems:

    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct test_ test;
    void methode(test *versuch);
    
    struct test_
    {
      int blah1;
    };
    
    int main()
    {
      test *test_1 = malloc(sizeof(test));
      test *test_2 = NULL;
      methode(test_1);
      methode(test_2);
      printf("%d \n", test_1->blah1);
      printf("%d \n", test_2->blah1);
      return 0;
    }
    
    void methode(test *versuch) {
      if (!versuch) {
        test *versuch_neu =  malloc(sizeof(test));
        versuch_neu->blah1 = 2;
        *versuch = versuch_neu;
        return;
      } else {
        versuch->blah1=4;
      }
    }
    

    Beschweren tut sich der gcc bei "*versuch = versuch_neu;" mit " error: incompatible types in assignment". Wie macht man eine solche Zuweisung korrekt?

    Wäre über eine kleine C-Nachhilfe sehr dankbar 🙂
    Grüße,
    Michael



  • #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct test_ test;
    
    /*
    void methode(test **versuch);
    
    struct test_
    {
      int blah1;
    };
    
    int main()
    {
      test *test_1 = malloc(sizeof(test));
      test *test_2 = NULL;
      methode(&test_1);
      methode(&test_2);
      printf("%d \n", test_1->blah1);
      printf("%d \n", test_2->blah1);
      return 0;
    }
    
    void methode(test **versuch) {
      if (!*versuch) {
        test *versuch_neu =  malloc(sizeof(test));
        versuch_neu->blah1 = 2;
        *versuch = versuch_neu;
        return;
      } else {
        (*versuch)->blah1=4;
      }
    }
    */
    
    test methode(int versuch);
    
    struct test_
    {
      int blah1;
    };
    
    int main()
    {
      test test_1;
      test test_2;
      test_1 = methode(1);
      test_2 = methode(0);
      printf("%d \n", test_1.blah1);
      printf("%d \n", test_2.blah1);
      return 0;
    }
    
    test methode(int versuch) {
      test ret;
      if (!versuch) {
        ret.blah1 = 2;
      } else {
    	ret.blah1 = 4;
      }
      return ret;
    }
    

    😕

    lg lolo



  • XDVD schrieb:

    void methode(test *versuch) {
      if (!versuch) {
        test *versuch_neu =  malloc(sizeof(test));
        versuch_neu->blah1 = 2;
        *versuch = versuch_neu;
        return;
      } else {
        versuch->blah1=4;
      }
    }
    

    versuch ist vom Typ test*, versuch_neu ist vom Typ test*.
    Du dereferenzierst versuch, also ist "versuch" vom Typ test.
    Also weißt du den Typ test
    zu einer Variable vom Typ test zu, was nicht geht.
    Lösung: Einfach nicht dereferenzieren.

    Weiteres Problem: Der neue Zeiger wird außerhalb der Funktion nicht bekannt sein. Du übergibst schließlich eine Kopie der Variable test_2 in Zeile 17. Diese Kopier wird in deiner Funktion überschrieben, nicht die ursprüngliche Variable.
    Lösung: Übergib die Adresse deiner Variable. Dies resultiert in Doppelzeiger, welchen du natürlich dereferenzieren musst.



  • Klasse, vielen Dank! noobLolos Antwort ging zwar ein bisschen an meinem Problem vorbei (danke für die Mühe trotzdem), aber Janjans Erklärung war perfekt! Gerettet! 😃



  • XDVD schrieb:

    noobLolos Antwort ging zwar ein bisschen an meinem Problem vorbei

    das ich das anders sehe sollte klar sein oder 😉

    lg lolo


Anmelden zum Antworten