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,它被声明和定义,并从函数内部调用。允许这样做吗?这可能吗?
此代码正在编译,但在调试时似乎退出。
首先,new_func
不是一个函数,它是一个函数指针。
您在问题中显示的代码片段将int
值转换为void (*)(int, int)
类型的函数指针并将其分配给new_func
:
new_func = (void (*)(int, int)) entry;
但是你没有提到什么参数传递给function()
函数的entry
参数。
您是否将函数指针类型转换为int
并将其作为第一个参数传递给函数function()
?
根据传递给function()
函数的第一个参数的值,你的程序可以有实现定义的行为或未定义的行为。
从<<p> em> C11 # 6.3.2.3p65整型可以转换为任意类型的指针。除非前面指定,否则结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示。67)
6任何指针类型都可以转换为整型。除前面指定的情况外,结果是由实现定义的。如果结果不能用整数类型表示,则该行为未定义。结果不需要在任何整数类型的值范围内。
嵌套函数不是标准的一部分。然而,一些编译器将其作为扩展来支持。比如gcc
。点击这里了解更多关于C中的嵌套函数
然而,这不是这里发生的事情。在你的代码中,它是一个函数指针。在这里阅读更多:C中的函数指针是如何工作的?
如果没有看到完整的代码,我会说entry
可能有错误的类型。应该是intptr_t
或uintptr_t
。什么是uintptr_t数据类型?