Comment modifier un pointeur qui a été passé dans une fonction en C?
Donc, j'ai un code, un peu comme celui-ci, pour ajouter une structure à une liste de structures:
void barPush(BarList * list,Bar * bar)
{
// if there is no move to add, then we are done
if (bar == NULL) return;//EMPTY_LIST;
// allocate space for the new node
BarList * newNode = malloc(sizeof(BarList));
// assign the right values
newNode->val = bar;
newNode->nextBar = list;
// and set list to be equal to the new head of the list
list = newNode; // This line works, but list only changes inside of this function
}
Ces structures sont définies comme suit:
typedef struct Bar
{
// this isn't too important
} Bar;
#define EMPTY_LIST NULL
typedef struct BarList
{
Bar * val;
struct BarList * nextBar;
} BarList;
puis, dans un autre fichier, je fais quelque chose comme ce qui suit:
BarList * l;
l = EMPTY_LIST;
barPush(l,&b1); // b1 and b2 are just Bar's
barPush(l,&b2);
cependant, après cela, l indique toujours EMPTY_LIST, pas la version modifiée créée à l'intérieur de barPush. Dois-je passer la liste en tant que pointeur vers un pointeur si je veux le modifier, ou est-il un autre sombre incantation requis?
5 réponses
vous devez passer dans un pointeur à un pointeur si vous voulez faire cela.
void barPush(BarList ** list,Bar * bar)
{
if (list == NULL) return; // need to pass in the pointer to your pointer to your list.
// if there is no move to add, then we are done
if (bar == NULL) return;
// allocate space for the new node
BarList * newNode = malloc(sizeof(BarList));
// assign the right values
newNode->val = bar;
newNode->nextBar = *list;
// and set the contents of the pointer to the pointer to the head of the list
// (ie: the pointer the the head of the list) to the new node.
*list = newNode;
}
Puis l'utiliser comme ceci:
BarList * l;
l = EMPTY_LIST;
barPush(&l,&b1); // b1 and b2 are just Bar's
barPush(&l,&b2);
Jonathan Leffler suggère de renvoyer le nouveau chef de liste dans les commentaires:
BarList *barPush(BarList *list,Bar *bar)
{
// if there is no move to add, then we are done - return unmodified list.
if (bar == NULL) return list;
// allocate space for the new node
BarList * newNode = malloc(sizeof(BarList));
// assign the right values
newNode->val = bar;
newNode->nextBar = list;
// return the new head of the list.
return newNode;
}
L'Usage devient:
BarList * l;
l = EMPTY_LIST;
l = barPush(l,&b1); // b1 and b2 are just Bar's
l = barPush(l,&b2);
réponse Générique: Passez un pointeur à la chose que vous voulez changer.
Dans ce cas, il serait un pointeur vers le pointeur que vous souhaitez modifier.
rappelez-vous, en C, tout est passé par valeur.
Vous passez un pointeur vers un pointeur, comme ceci
int myFunction(int** param1, int** param2) {
// now I can change the ACTUAL pointer - kind of like passing a pointer by reference
}
Oui, il faut passer un pointeur vers le pointeur. C transmet les arguments par valeur, pas par référence.
C'est un problème classique. Soit retourner le noeud alloué ou utiliser un pointeur de pointeur. En C, vous devez passer un pointeur vers un X vers une fonction où vous voulez que votre X soit modifié. Dans ce cas, puisque vous voulez un pointeur à être modifié, vous devez passer un pointeur vers un pointeur.