Question

main () appelle la fonction Call_By_Test () avec le paramètre argument premier nœud. J'ai libéré le premier nœud dans Call_By_Test () mais l'adresse du premier noeud non libéré en main (), pourquoi?.

typedef struct LinkList{
int data;
struct LinkList *next;
}mynode;

void Call_By_Test(mynode * first)
{
        free(first->next);
        first->next = (mynode *)NULL;
        free(first);
        first = (mynode *)NULL;
}
int main()
{
mynode *first;

first = (mynode *)malloc(sizeof(mynode));
first->data = 10;
first->next = (mynode *)NULL;

cout<<"\n first pointer value before free"<<first<<endl;

Call_By_Test(first);
// we freed first pointer in Call_By_Test(), it should be NULL
if(first != NULL)
        cout<< " I have freed first NODE in Call-By-Test(), but  why first node pointer has the value "<<first<<endl;


}

Sortie:  première valeur de pointeur 0x804b008  J'ai libéré d'abord NODE Call-By-Test (), mais pourquoi premier pointeur de nœud a la valeur 0x804b008

Était-ce utile?

La solution

Puisque la question est étiquetée c ++, je factoriser à:

void Call_By_Test( mynode *& first ) // rest of code remains the same

qui transmet le passage par référence sans déréférence supplémentaires. Toutes les solutions qui proposent le passage d'un pointeur sur le pointeur (void Call_By_Test( mynode ** first )) utilisent la sémantique passe par valeur à un pointeur vers la variable de pointeur. Alors que vous pouvez le faire en C ++, passage par référence est plus claire.

Autres conseils

La réponse est que vous n'utilisez pas passer par référence. Vous passez un pointeur en valeur - et ce n'est pas la même chose. Cela signifie que vous verrez des changements dans les données que le pointeur se réfère, mais en changeant la valeur de first lui-même dans la méthode Call_By_Test ne fait rien.

Dans la fonction

void Call_By_Test(mynode * first)

première est effectivement une variable locale de la fonction. La modification il ne changera pas l'état du reste du programme. Vous avez besoin d'une référence à un pointeur ou un pointeur vers un pointeur:

void Call_By_Test(mynode ** first)
{
        free((*first)->next);
        (*first)->next = NULL;
        free(*first);
        *first = NULL;
}

et de l'appeler:

Call_By_Test( & first );

Quand vous faites:

void Call_By_Test(mynode * first)

Vous copiez d'abord, afin que vous puissiez travailler sur ce qui se trouve dans la première, mais vous ne pouvez pas changer l'adresse d'abord car il est une copie.

Si vous voulez changer la première valeur, alors vous devriez avoir une fonction comme ceci:

void Call_By_Test(mynode ** first)

ou

void Call_By_Test(mynode & first)

qui vous permettent d'accéder d'abord l'argument comme si elle était la variable d'origine (et non une copie de la fonction principale)

Si vous free un pointeur (comme 0x804b008), qui ne change pas les bits dans le pointeur lui-même. Il permet simplement la bibliothèque C de enregistrer que la mémoire à la pointe à l'adresse n'est plus utilisé, et peut être recyclé. Dans votre cas, lorsque vous imprimez 0x804b008, la mémoire à l'adresse 0x804b008 est disponible pour les réutiliser par la bibliothèque C de.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top