Donc, j'ai du code, un peu comme le suivant, 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 ceci:
BarList * l;
l = EMPTY_LIST;
barPush(l,&b1); // b1 and b2 are just Bar's
barPush(l,&b2);
Cependant, après cela, je pointe toujours vers 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 y a-t-il une autre incantation sombre requise?
Vous devez passer un pointeur à un pointeur si vous voulez le faire.
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;
}
Ensuite, utilisez-le comme ceci:
BarList * l;
l = EMPTY_LIST;
barPush(&l,&b1); // b1 and b2 are just Bar's
barPush(&l,&b2);
Jonathan Leffler a suggéré de retourner 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'utilisation 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 sur la chose que vous souhaitez modifier.
Dans ce cas, ce serait un pointeur sur le pointeur que vous souhaitez modifier.
Souvenez-vous qu'en C, TOUT est passé par valeur.
Vous passez un pointeur à 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, vous devez passer un pointeur au pointeur. C transmet les arguments par valeur et non par référence.
C'est un problème classique. Soit renvoyez le nœud alloué, soit utilisez un pointeur de pointeur. En C, vous devez passer un pointeur vers un X à une fonction où vous souhaitez que votre X soit modifié. Dans ce cas, puisque vous voulez qu'un pointeur soit modifié, vous devez passer un pointeur à un pointeur.