pointeur sur un pointeur dans une liste chaînée

J’essaie de définir une tête de liste liée par le biais d’un pointeur à un pointeur. Je peux voir à l’intérieur de la fonction que l’adresse du pointeur principal change, mais lorsque je reviens au programme principal, il redevient NULL. quelqu’un peut-il me dire ce que je fais mal ??

#include  #include  typedef void(*fun_t)(int); typedef struct timer_t { int time; fun_t func; struct timer_t *next; }TIMER_T; void add_timer(int sec, fun_t func, TIMER_T *head); void run_timers(TIMER_T **head); void timer_func(int); int main(void) { TIMER_T *head = NULL; int time = 1; fun_t func = timer_func; while (time time = sec; new_timer->func = func; new_timer->next = NULL; while((*ppScan != NULL) && (((**ppScan).time)next; new_timer->next = *ppScan; *ppScan = new_timer; } 

Puisque les arguments de la fonction C sont passés par leur valeur et non par leur adresse et que vous ne transmettez l’adresse d’aucune variable dans votre appel:

 add_timer(time, func, head); 

de sorte qu’aucun d’entre eux ne sera changé en dehors de la add_time fonction add_time .

Ce que vous devez probablement faire est de passer l’adresse de head :

 add_timer(time, func, &head); 

et:

 void add_timer(int sec, fun_t func, TIMER_T **head) { TIMER_T ** ppScan = head; // ... } 

Vous l’avez mal compris. La fonction doit prendre un double pointeur et l’ appelant doit prendre l’adresse-de:

 { // caller TIMER_T *head = NULL; do_something(&head); } void do_something(TIMER_T ** p) // callee { *p = malloc(sizeof(TIMER_T*)); // etc. } 

Il y a eu beaucoup , beaucoup de réponses similaires comme celle-ci auparavant.