gpt4 book ai didi

c - 为什么我不能在 C 中从返回的结构中调用函数指针?

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:19 26 4
gpt4 key购买 nike

好吧,我只学了几个星期的 C,但遇到了一些问题。我有一个充满 Bsig 指针的优先级队列。作为一项附加功能,我希望每当弹出 Bsig 时,我们都执行自定义函数。

typedef struct bsig{
// some more fields here, but they're not important
struct onpop_t *on_pop;
} Bsig;

typedef struct onpop_t {
struct onpop_t *next;
int (*do_on_pop)(Bsig *caller);
} Onpop;

int pop(SigPQ *q, Bsig* ret_sig){
if (q->size < 1){
return 0;
}
Bsig* signal = q->signals[0];
assert(signal);
q->signals[0] = q->signals[q->size-1];
q->size--;
sigpq_heapify(q,0);

if(signal->on_pop){
signal->on_pop->do_on_pop(signal);
}
ret_sig = signal;
return 1;
}

所以基本上,无论何时我们调用 pop,do_on_pop 函数都应该启动。此外,pop 接受一个信号指针,该指针被从队列中弹出的任何内容覆盖。所有这些都发生在 main.c 包含的两个文件中。以下内容来自 main(其中 testpop 是一个自定义函数,它会随机打印一些东西 - 它在 main.c 文件中声明和定义):

Bsig *sig1 = new_signal(1000, 0);
Onpop *onpop1 = malloc(sizeof(Onpop));
onpop1->do_on_pop = &testpop;
sig1->on_pop = onpop1;
push(pq, sig1);

Bsig *ret_sig;
pop(pq,ret_sig);

到目前为止一切顺利 - 自定义函数 testpop 被调用。但是

ret_sig->on_pop->do_on_pop(ret_sig);

from main 给出了段错误!我不明白为什么。 ret_sig地址和信号地址应该是一样的,函数调用也是一样的——唯一的区别是一个是从main中调用,一个是从包含的.c文件中调用。任何人都可以阐明吗?

最佳答案

您需要通过引用显式传递 ret_sig

int pop(SigPQ *q, Bsig** ret_sig){
if (q->size < 1){
return 0;
}
Bsig* signal = q->signals[0];
assert(signal);
q->signals[0] = q->signals[q->size-1];
q->size--;
sigpq_heapify(q,0);

if(signal->on_pop){
signal->on_pop->do_on_pop(signal);
}
*ret_sig = signal;
return 1;
}

并传递ret_sig的地址

Bsig *ret_sig;
pop(pq,&ret_sig);

或者更改函数以返回指针而不是 int(更简洁):

Bsig *pop(SigPQ *q){
if (q->size < 1){
return NULL;
}
Bsig* signal = q->signals[0];
assert(signal);
q->signals[0] = q->signals[q->size-1];
q->size--;
sigpq_heapify(q,0);

if(signal->on_pop){
signal->on_pop->do_on_pop(signal);
}
return signal;
}

并赋值返回值:

Bsig *ret_sig = pop(pq);

关于c - 为什么我不能在 C 中从返回的结构中调用函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40636632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com