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.