void function(int entry, int x1, int x2)
{
void (*new_func)(int n1, int n2);
new_func = (void (*)(int, int)) entry;
new_func(x1,x2);
}
假设我们有这个函数,有一个函数 new_func 是从函数内部声明、定义和调用的。 这是允许的吗?这可能吗?
此代码正在编译,但在调试时似乎正在退出。
嵌套函数不是标准的一部分。但是,一些编译器支持将其作为扩展。喜欢
gcc
。在此处阅读有关 C 中嵌套函数的更多信息C 中的嵌套函数
然而,这不是这里发生的事情。在您的代码中,它是一个函数指针。在这里阅读更多相关信息:C 中的函数指针如何工作?
在没有看到整个代码的情况下,我会说
entry
可能有错误的类型。应该是intptr_t
或者uintptr_t
。 uintptr_t 数据类型是什么?
首先,
new_func
不是一个函数,它是一个函数指针。
您在问题中显示的代码片段正在将
int
值转换为函数指针类型并将其分配给 new_func
:
new_func = (void (*)(int, int)) entry;
但是您没有提到传递给
entry
函数的function()
参数的参数。int
并将其作为第一个参数传递给函数function()
?
您的程序可以具有实现定义的行为或未定义的行为,具体取决于传递的第一个参数的值
function()
函数。
来自C11#6.3.2.3p5
5 整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。 67)
来自C11#6.3.2.3p6
6 任何指针类型都可以转换为整数类型。除了前面指定的,结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。