【发布时间】:2020-04-15 22:38:25
【问题描述】:
下面程序中的蹦床功能正常工作。我认为下面的程序会导致堆栈溢出,因为函数 thunk_f 和 thunk1 无限期地相互调用,从而导致创建新的堆栈帧。但是,我想编写一个行为更类似于非终止循环的程序,因为蹦床应该防止堆栈溢出。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
void trampoline(void *(*func)()) {
while (func) {
void *call = func();
func = (void *(*)())call;
}
}
void *thunk1(int *param);
void *thunk_f(int *param);
void *thunk1(int *param)
{
++*param;
trampoline(thunk_f(param));
return NULL;
}
void *thunk_f(int *param)
{
return thunk1(param);
}
int main(int argc, char **argv)
{
int a = 4;
trampoline(thunk1(&a));
printf("%d\n", a);
}
【问题讨论】:
-
trampoline的定义在哪里? -
thunk1似乎调用了thunk_f,它调用了thunk1,它调用了thunk_f,它...... -
好吧,不这样做可以避免堆栈溢出。
-
据我所知,没有合法的非终止循环用例。每个有用的循环实例最终都会终止。
-
@PaulHankin 该技术已经成熟。在这里只是误用了。
标签: c trampolines