verschachtelete Struktur an Funktion übergeben



  • nwp2 schrieb:

    Auch wenn mir das niemand glaubt, buffer[zahl] ist immer ganz schlecht.

    Geht das jetzt schon wieder los?
    🙂



  • Ich mag deine Signatur 😉



  • nwp2 schrieb:

    Auch wenn mir das niemand glaubt, buffer[zahl] ist immer ganz schlecht.

    Das ist doch Quatsch.
    Aber das hatten wir ja schon, das weißt du auch.



  • Also erst mal Danke für die Antworten! Auch wenn es teilweise etwas vom Thema abweichte 😉

    Also erst mal bin ich voll auf diese Erklärung: http://www.c-plusplus.net/forum/viewtopic-var-t-is-206606.html abgefahren. Die Zeiten dass ich mallocs/callocs gecastet habe sind vorbei.

    So jetzt habe ich aber ein Problem mit dem freigeben. Ich übergebe einer Funktion einen Zeiger auf einen Zeiger. In der Funktion wird an diesen Zeiger ein Zeiger auf eine Struktur gehängt. So würde ich gerne den Inhalt der Struktur in der Hauptroutine auswerten und erst dort den Speicher freigeben. Es lässt sich kompilieren, bricht dann aber und Valgrind meckert aber etwas von "Access not within mapped region". Wie macht man das denn sonst?

    typedef struct _knoten {
      char* vorname;
      char* nachname;
    }knoten;
    
    int namen_eintragen(knoten** mynode);
    
    main()
    {
      int rueckgabe = 0,
          zaehler   = 0;
      pKnoten** mynode = NULL;
    
      rueckgabe = namen_eintragen(mynode);
    
      // ausgabe...
      //printf(...
    
      // Freigabe
      // zuerst Freigabe der namen
      free(mynode[0]->vorname);
      free(mynode[0]->nachname);
      // dann Freigabe des Knotens
      free(mynode[0]);
      // und eventuell noch den Zeigerspeicher verringern mit realloc ...
    
    }
    
    int namen_eintragen(knoten** mynode)
    {
      char vor_name[]  = "Fritz\0";
      char nach_name[] = "Semmel\0";
    
      char* pVorname      = NULL;
      char* pNachname     = NULL;
      knoten** pivot_node = NULL;
      knoten*  local_node = NULL;
    
      /*! genug Platz schaffen für Zeiger auf Zeiger  */
      pivot_node = realloc(mynode, 2 * sizeof(**mynode));
      if(pivot_node != NULL)
      {
        mynode = pivot_node;
      }
      else
      {
        printf("Problem mit realloc\n");
      }
    
      /*! reserviere Speicher für den Vornamen         */
      if((pVorname = calloc (strlen(vor_name), sizeof(*pVorname))) == NULL)
      {
        printf("Problem beim Belegen von Speicher fuer wortstring\n");
        exit(-1);
      }
      strncpy(pVorname, vor_name, strlen(vor_name));
    
      /*! reserviere Speicher für den Nachnamen         */
      if((pNachname = calloc (strlen(nach_name), sizeof(*pNachname))) == NULL)
      {
        printf("Problem beim Belegen von Speicher fuer wortstring\n");
        exit(-1);
      }
      strncpy(pNachname, nach_name, strlen(nach_name));
    
      /*! lege Speicher für ein "knoten"-Element an */
      if((local_node = calloc (1, sizeof(*local_node))) == NULL)
      {
        printf("Problem beim Belegen von Speicher fuer das hdom_tspan-Element\n");
        exit(-1);
      }
      local_node->vorname = pVorname;
      local_node->nachname = pNachname;
    
      mynode = local_node;
    
      return 2;
    }
    


  • sehr schön du hast es geschafft für ein struct mit 2 membern 4x malloc/realloc/calloc aufzurufen. ich bin stolz auf dich, und nwp2 sicher auch. 👍

    lg lolo



  • noobLolo schrieb:

    sehr schön du hast es geschafft für ein struct mit 2 membern 4x malloc/realloc/calloc aufzurufen. ich bin stolz auf dich, und nwp2 sicher auch. 👍

    lg lolo

    😃

    columbus schrieb:

    ...
    Wie macht man das denn sonst?
    ...

    So schonmal nicht :p
    Es gibt einiges, was du noch überdenken musst, z.B. schreibst du in Zeile 39

    columbus schrieb:

    /*! genug Platz schaffen für Zeiger auf Zeiger  */
    

    Das ist prinzipiell falsch ( auch wenn hier tatsächlich zufälligerweise genug Speicher für einen Zeiger auf einen Zeiger reserviert wird ), damit reservierst du Speicherplatz für 2 Strukturelemente.

    Den Prototypen würde ich in deinem Beispiel als

    int namen_eintragen(knoten* mynode);
    

    deklarieren und dementsprechend die Funktion schreiben.



  • Okay das Beispiel ist für den Zweck ziemlich "oversized". Aber in meinem Problem übergebe ich ja ein Array von Zeigern einer Funktion, das wollte ich etwas vereinfachen, ist mir aber nicht sonderlich gelungen (sprich: mein Beispiel entspricht nicht meinem eigentlichen Problem). Die 2 im realloc ist schlicht ein vertipper.
    Aber ich habe mir auch schon gedacht dass wenn ich einen Zeiger auf einen Zeiger erzeuge und als solchen einer Funktion übergebe, wird das einfach nur als Kopie und nicht als Referenz interpretiert.
    Aber wenn ich der Funktion nur einen einfachen Zeiger gebe, kann sie damit nicht ArrayElemente "andocken".
    Also versuche ich es mit einem dreifach-Zeiger und übergebe diesem einer Funktion, die einen zweifach-Zeiger erwartet.

    Gruss Christian



  • columbus schrieb:

    Also versuche ich es mit einem dreifach-Zeiger und übergebe diesem einer Funktion, die einen zweifach-Zeiger erwartet.

    Dreifach-Zeiger? Gratuliere, du hast dich als Three-Star-Programmer qualifiziert! 🙂



  • Ja genau, vielen Dank und Tschüss.



  • columbus schrieb:

    Die 2 im realloc ist schlicht ein vertipper.

    Die doppelte Dereferenzierung ist auch ein Vertipper?


Anmelden zum Antworten