C 指向链接列表中指针的指针
我试图通过指向指针的指针设置链表头。我可以在函数内部看到头指针的地址正在更改,但当我返回主程序时,它再次变为NULL。有人能告诉我我做错了什么吗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;
#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.
}
以前也有类似的答案