Zeigerspass mit list deletion
-
Hallo!
Ich habe hier zwei Methoden, die eine dyn. Liste loeschen sollen. Sie lauten:
void hlpDeletePlayerCards(int player) { SPLAYERHAND *dum, *dum1; if(!hlpCheckPlayer(player)) return; if(!g_player[player].handBegin) return; dum = g_player[player].handBegin->left; while (dum != NULL) { dum1 = g_player[player].handBegin->left->left; g_player[player].handBegin->left = dum1; free(dum); dum = dum1; } if (g_player[player].handBegin) { free(g_player[player].handBegin); } g_player[player].handBegin = NULL; g_player[player].handBegin = NULL; printf("\n########\n"); printAllCardsPlayer(0); printf("\n########\n"); }
und
void hlpDeletePlayerCards2(SPLAYERHAND *stack) { SPLAYERHAND *dum, *dum1; if(!stack) return; dum = stack->left; while (dum != NULL) { dum1 = stack->left->left; stack->left = dum1; free(dum); dum = dum1; } if (stack) { printf("beg %d \n",stack->card.value); free(stack); } stack = NULL; printf("\n############\n"); printAllCardsPlayer(0); printf("\n############\n"); }
Die zweite Methode waere guenstiger fuer mich, weil ich fuer jeden Player mehrere Listenanker habe, nicht bloss den handBegin. Ich koennte mit der zweiten Methode also allgemein solche Kartenlisten erledigen. Allerdings wird bei Methode 2 nie der Kopf der Liste geloescht. Waehrend bei 1 das printAllCardsPlayer(0) erwartungsgemaess nix ausgibt, wird bei 2 noch der Kopf der Kartenliste ausgegeben, der ja eigentlich dank free(stack) und stack = NULL weg sein muesste.
Was mache ich denn falsch?
-
Hi chokomuro
mir fehlen die worte fü eine erklärung;
versuche folgendes das fumktioniertvoid hlpDeletePlayerCards2(SPLAYERHAND **stack) { SPLAYERHAND *dum, *dum1; if(!*stack) return; dum = *stack->left; while (dum != NULL) { dum1 = *stack->left->left; *stack->left = dum1; free(dum); dum = dum1; } if (*stack) { printf("beg %d \n",*stack->card.value); free(*stack); } *stack = NULL; printf("\n############\n"); printAllCardsPlayer(0); printf("\n############\n"); }
kurt
-
zur demonstration ein kleines testprogramm
void del( void * p ) { p = 0; } void del2( void ** p ) { *p = 0; } int main( int argc, char** argv ) { void * p = (void*)1; del( p); printf( "%p\n", p ); del2(&p); printf( "%p\n", p ); }
-
Danke fuer die raschen Antworten.
Das kleine Beispiel (mit %p druckt man also Zeiger aus, ich habe dummerweise immer %d verwendet) erweckt folgende Vermutung:Bei del() uebergebe ich eine Kopie des Zeigers p aus main und setze diese auf 0. Kehre ich aus der Funktion zurueck, ist der Zeiger p aus main aber immer noch auf dem alten Wert.
Bei del2() habe ich quasi call-by-reference, ich uebergebe einen Zeiger auf den Zeiger p der main-Methode. Nun setze ich wirklich das, was sich hinter dem 'main-p' verbirgt, auf NULL.Ist das richtig?
-
könnte es nich besser erklären
kurt