Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向链接列表中指针的指针_C_Pointers_Linked List - Fatal编程技术网

C 指向链接列表中指针的指针

C 指向链接列表中指针的指针,c,pointers,linked-list,C,Pointers,Linked List,我试图通过指向指针的指针设置链表头。我可以在函数内部看到头指针的地址正在更改,但当我返回主程序时,它再次变为NULL。有人能告诉我我做错了什么吗 #include <stdio.h> #include <stdlib.h> typedef void(*fun_t)(int); typedef struct timer_t { int time;

我试图通过指向指针的指针设置链表头。我可以在函数内部看到头指针的地址正在更改,但当我返回主程序时,它再次变为NULL。有人能告诉我我做错了什么吗

           #include <stdio.h>
           #include <stdlib.h>

           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 < 1000) {
              printf("\nCalling add_timer(time=%d, func=0x%x, head=0x%x)\n", time,     

              func, &head);
               add_timer(time, func, head);
               time *= 2;
              }  
              run_timers(&head);

              return 0;
             }

            void add_timer(int sec, fun_t func, TIMER_T *head)
            {
           TIMER_T ** ppScan=&head;
               TIMER_T *new_timer = NULL;
           new_timer = (TIMER_T*)malloc(sizeof(TIMER_T));
               new_timer->time = sec;
               new_timer->func = func;
               new_timer->next = NULL;

               while((*ppScan != NULL) && (((**ppScan).time)<sec))
               ppScan = &(*ppScan)->next;

               new_timer->next = *ppScan;
               *ppScan = new_timer;
               } 
#包括
#包括
typedef void(*fun_t)(int);
类型定义结构计时器{
整数时间;
娱乐功能;
结构计时器*下一步;
}定时器;
无效添加计时器(整数秒、乐趣函数、计时器头);
无效运行计时器(计时器**头);
无效计时器_func(int);
内部主(空)
{
定时器头=空;
整数时间=1;
fun\u t func=计时器功能;
同时(时间<1000){
printf(“\n调用添加计时器(时间=%d,func=0x%x,head=0x%x)\n”,时间,
财长及团长);
添加定时器(时间、函数、头);
时间*=2;
}  
运行计时器(&head);
返回0;
}
无效添加计时器(整数秒、乐趣函数、计时器头)
{
定时器**ppScan=&head;
计时器\u T*新的\u计时器=空;
新定时器=(定时器T*)malloc(定时器T*);
新定时器->时间=秒;
新建定时器->func=func;
新建定时器->下一步=NULL;
而((*ppScan!=NULL)和((**ppScan.time)下一步;
新建定时器->下一步=*ppScan;
*ppScan=新定时器;
} 

由于C函数参数是通过其值传递的,而不是通过其地址传递的,因此调用中不传递任何变量的地址:

add_timer(time, func, head);
因此,在
add_time
功能范围之外,不会对其进行任何更改

您可能需要做的是传递
头的地址

add_timer(time, func, &head);
以及:


由于C函数参数通过其值传递,而不是通过其地址传递,并且在调用中不传递任何变量的地址:

add_timer(time, func, head);
因此,在
add_time
功能范围之外,不会对其进行任何更改

您可能需要做的是传递
头的地址

add_timer(time, func, &head);
以及:


您搞错了。函数需要采用双指针,调用方需要采用以下地址:

{   // caller
    TIMER_T *head = NULL;
    do_something(&head);
}

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

以前也有类似的答案。

您的答案是错误的。函数需要使用双指针,调用方需要使用以下地址:

{   // caller
    TIMER_T *head = NULL;
    do_something(&head);
}

void do_something(TIMER_T ** p)  // callee
{
    *p = malloc(sizeof(TIMER_T*));
    // etc.
}
以前也有类似的答案