C 将整数强制转换为函数指针

C 将整数强制转换为函数指针,c,pointers,function-pointers,C,Pointers,Function Pointers,我试图将整数转换为函数指针。基本上,我的整数值包含函数指针的地址,所以我尝试将其转换为它 我正在努力做到以下几点- typedef void (*func_ptr)(unsigned int arg1); void function1(unsigned int argument) { } void function2(unsigned int argument, func_ptr argument2) { /* Do something here*/ } void function

我试图将整数转换为函数指针。基本上,我的整数值包含函数指针的地址,所以我尝试将其转换为它

我正在努力做到以下几点-

typedef void (*func_ptr)(unsigned int arg1);

void function1(unsigned int argument)
{
}

void function2(unsigned int argument, func_ptr argument2)
{
    /* Do something here*/
}

void function3(unsigned int argument)
{
    function2(123,(func_ptr)argument);
}
我正在调用function3,它的参数包含function1的地址。当我运行程序时,我得到以下警告-

cast to pointer from integer of different size [-Wint-to-pointer-cast]

有什么方法可以处理这个警告吗?

不要养成尝试将整数类型强制转换为指针的习惯。这不是传递某物地址的正确方法-这就是为什么存在指针类型。是的,如果无符号类型与指针大小相同,则可以使用无符号类型表示指针,但不要在需要指针的地方使用指针

在function3的示例中,您希望从其中调用function2。由于函数2需要一个func_ptr类型作为参数,因此函数3的参数列表中应该有一个func_ptr类型的参数,以便您可以将其传递给函数2。除非您有一个全局定义的func_ptr,但也应该避免,除非绝对需要,比如回调,在这里不相关,在学习C时很少见到

举一个简单的例子,把你的作品拼在一起可能会有所帮助。这将利用函数定义和typedef为function3提供一个适当的参数,它可以在调用function2时使用该参数,例如

仔细检查一下,如果你还有其他问题,请告诉我

将整数强制转换为函数指针 我希望它是独立的系统

这不是100%可能的,因为C没有指定一个整数类型,它肯定可以保存所有原始函数指针

整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示。C11dr§

走另一条路:

任何指针类型都可以转换为整数类型。除非前面指定,否则结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内。§

示例:函数指针为128位,最宽的整数类型为64位

代码可以尝试使用最宽的整数类型,如uintmax\t。尽管这样做的成功几率很高,但在某些平台上可能仍然太小


但是,像uintptr\t这样的可选整数类型可以往返于void*对象指针。函数指针可能比void*更宽,因此这种方法不适用于独立于系统的解决方案。

C标准不允许将void*转换为指向函数的指针,也不允许将void*转换为返回-void*的措辞如下:

指向void的指针可以转换为指向任何对象类型的指针,也可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void的指针,然后再返回;结果应与原始指针进行比较

但是,函数不是对象,因此您甚至无法将函数指针强制转换为void*可移植

现在,据说指针可以转换为整数,然后再转换回来,不过:

6任何指针类型都可以转换为整数类型。除非前面指定,否则结果是实现定义的。如果结果不能用整数类型表示,则行为未定义。结果不必在任何整数类型的值范围内

如果函数指针是64位和int 32位,那么行为是未定义的。对于指向对象的指针,可以使用uintptr\u t,但这不能保证与函数指针一起工作。相反,对于函数指针,可以保证您可以将任何函数指针强制转换为另一个函数指针,因此您可以使用

typedef void (*funcptr)(void);
并在调用之前将其转换为正确的函数指针类型

如果还需要整数,则必须使用并集

union int_or_funcptr {
    int integer;
    funcptr function;
}

如果需要该函数,请分配或读取联合的函数成员,并在调用它之前正确地强制转换它。

您运行的是一个64位系统,其中int是4字节,而指针是8字节,对吗?为什么不使function3func\u ptr参数无效?那么函数2123,参数@iBug是的,但我想让它成为一个系统independant@David,我不明白你想说什么。你想做什么没有捷径可走。如果可移植性是你的目标,不要在函数指针和其他任何东西之间转换。
typedef void (*funcptr)(void);
union int_or_funcptr {
    int integer;
    funcptr function;
}