Struktur von Struktur array an Funktion übergeben



  • Hallo,
    Ich habe hier ein kleines Problem mit meinem Struktur array.
    Ich übergebe die Adresse von der gewünschten Struktur an eine Funktion um sie zu befüllen.
    Aber wie die Ausgabe zeigt, ist nachher der Zeiger im Strucktur array immer noch auf NULL
    und der Eintrag ist auch nicht vorhanden.

    Was mache ich falsch?
    Danke für Hilfe.

    #include <stdio.h>
    #include <stdlib.h>
    #include <console.h>

    void Einfuegen(struct STRUCT_WOERTERBUCH *tWoerterbuch);
    void Free(struct STRUCT_WOERTERBUCH **taWoerterbuch);

    typedef struct STRUCT_WOERTERBUCH
    {
    unsigned int uiLZW_Code;
    struct STRUCT_WOERTERBUCH *tWeiterer_Eintrag;

    }STRUCT_WOERTERBUCH;

    int main()
    {
    int iCounter1 = 0;
    STRUCT_WOERTERBUCH **taWoerterbuch;

    taWoerterbuch = (STRUCT_WOERTERBUCH**)malloc(10 * sizeof(*taWoerterbuch));

    // init
    for(iCounter1=0;iCounter1 < 10;iCounter1++)
    taWoerterbuch[iCounter1] = NULL;

    printf("taWoerterbuch[5] vorher:%p\n",taWoerterbuch[5]);

    Einfuegen(&(*taWoerterbuch[5]));

    printf("taWoerterbuch[5] nachher:%p\n",taWoerterbuch[5]);
    printf("taWoerterbuch[5]->uiLZW_Code:%u\n",taWoerterbuch[5]->uiLZW_Code);

    Free(&(*taWoerterbuch));

    return(0);
    }

    void Einfuegen(struct STRUCT_WOERTERBUCH *tWoerterbuch)
    {
    int iCounter1 = 0;
    STRUCT_WOERTERBUCH *tWoerterbuch_Temp = tWoerterbuch;

    // letzten eintrag suchen und eintragen
    while(tWoerterbuch != NULL)
    tWoerterbuch = tWoerterbuch->tWeiterer_Eintrag;

    tWoerterbuch = (STRUCT_WOERTERBUCH*)malloc(sizeof(STRUCT_WOERTERBUCH));

    tWoerterbuch->uiLZW_Code = 10;

    if(tWoerterbuch_Temp != NULL)
    tWoerterbuch = tWoerterbuch_Temp;
    }

    void Free(struct STRUCT_WOERTERBUCH **taWoerterbuch)
    {
    long lCounter1 = 0;

    STRUCT_WOERTERBUCH *tWoerterbuch_Temp1 = NULL;
    STRUCT_WOERTERBUCH *tWoerterbuch_Temp2 = NULL;

    for(lCounter1=0;lCounter1 < 10;lCounter1++)
    {
    tWoerterbuch_Temp1 = taWoerterbuch[lCounter1];

    while(tWoerterbuch_Temp1 != NULL)
    {	
    	tWoerterbuch_Temp2 = tWoerterbuch_Temp1->tWeiterer_Eintrag;
    	
    	free(tWoerterbuch_Temp1);
    	
    	tWoerterbuch_Temp1 = tWoerterbuch_Temp2;
    }
    

    }
    }

    /*

    Ausgabe:

    taWoerterbuch[5] vorher:00000000
    taWoerterbuch[5] nachher:00000000
    taWoerterbuch[5]->uiLZW_Code:65485

    */



  • Geb Dir bitte die Mühe den Code ordentlich zu formatieren. Dafür gibt es die Codetags, und man kann seinen Beitrag editieren.

    Danke



  • @WMW sagte in Struktur von Struktur array an Funktion übergeben:

    Einfuegen(&(*taWoerterbuch[5]));

    Was soll das werden? Das taWoerterbuch hast du mit NULLen initialisiert, also ist taWoerterbuch[5] auch NULL. Das darfst du nicht dereferenzieren. Und dann der Adressoperator davor - was willst du erreichen?

    Wenn du die Adresse des Elements mit dem Index 5 per Adresse übergeben willst, dann mit dem Adressoperator (und ohne *). Deine Funktion Einfuegen verstehe ich auch nicht so recht.

    Mir scheint, du vermischt irgendwie eine verkettete Liste (was das STRUCT_WOERTERBUCH js wohl sein soll) mit dem dynamisch reservierten Speicher des taWoerterbuch. Mit ist gar nicht ganz klar, was du exakt erreichen willst.



  • In C werden Argumente an Funktionen immer als Wert übergeben (call by value), das gilt auch für Zeiger.
    Dh der Wert wird zuvor kopiert und die Kopie an die Funktion übergeben, dh in der Funktion kannst du niemals an dem Ausgangswert vor dem Funktionsaufruf etwas ändern, denn du siehst ihn ja nicht.
    Wenn du einen Zeiger ändern willst, musst du also einen Zeiger auf einen Zeiger übergeben.

    <console.h> ist kein Standard.
    Verkettete Listen sind akademischer Unsinn; das hast du ja auch selbst schon eingesehen, indem du ein Array verwendest.

    typedef struct STRUCT_WOERTERBUCH 
    {
    unsigned int uiLZW_Code;
    struct STRUCT_WOERTERBUCH *tWeiterer_Eintrag;
    } STRUCT_WOERTERBUCH;
    void Einfuegen (STRUCT_WOERTERBUCH **tWoerterbuch);
    void Free (STRUCT_WOERTERBUCH **taWoerterbuch);
    
    int main() 
    {
    STRUCT_WOERTERBUCH **taWoerterbuch;
    
    taWoerterbuch = calloc (10,sizeof*taWoerterbuch);
     
    printf("taWoerterbuch[5] vorher:%p\n",(void*)taWoerterbuch[5]);
    
    Einfuegen(taWoerterbuch+5);
    
    printf("taWoerterbuch[5] nachher:%p\n",(void*)taWoerterbuch[5]);
    printf ("taWoerterbuch[5]->uiLZW_Code:%u\n",taWoerterbuch[5]->uiLZW_Code);
      
    Free(taWoerterbuch);
    return 0;
    }
    
    void 
    Einfuegen(STRUCT_WOERTERBUCH **tWoerterbuch) 
    {
    *tWoerterbuch = malloc(sizeof**tWoerterbuch);
    (*tWoerterbuch)->uiLZW_Code = 10;
    }
    
    void Free (STRUCT_WOERTERBUCH **taWoerterbuch) 
    {
    long lCounter1 = 0;
    for (lCounter1 = 0; lCounter1 < 10; lCounter1++) free(taWoerterbuch[lCounter1]);
    free(taWoerterbuch);
    }
    

    https://onlinegdb.com/8tayrBPZF



  • Danke Wutz, jetzt funktionierts


Anmelden zum Antworten