将子程序的地址转换为 void 指针

2024-03-14

尽管函数指针大小并不总是与不透明指针大小相同,但可以使用 void 指针来转换函数位置吗?

我已经搜索过不透明指针和转换函数指针。我发现函数指针和普通指针在某些系统上不一样。

 void (*fptr)(void) = (void *) 0x00000009; // is that legal???

我觉得我应该这样做

 void (*fptr)(void)= void(*)(void) 0x00000009;

它确实工作得很好,尽管我预计会出现一些错误或至少是警告 我用的是keilarm编译器


不,问题是你不能在两者之间切换void*和函数指针,它们不是兼容的类型。void*是通用指针类型对象指针 only.

在第二种情况下,你有一个小的语法错误,应该是(void(*)(void))。解决这个问题,我们有:

void (*fptr)(void) = (void *) 0x00000009;         // NOT OK
void (*fptr)(void) = (void(*)(void)) 0x00000009;  // PERHAPS OK (but likely not on ARM)

对于前者,它根本不是有效的 C(但可能作为非标准编译器扩展得到支持)。具体来说,它违反了简单赋值规则,C17 6.5.16.1。的两个操作数=必须是兼容的指针类型。

关于后者,相关部分是C17 6.3.2.3/5

整数可以转换为任何指针类型。除先前指定的情况外, 结果是实现定义的,可能未正确对齐,可能未指向 引用类型的实体,并且可能是陷阱表示。

空指针存在一些特殊情况,但这不适用于您的情况。

所以你可以probably将值 9 转换为函数指针 - 您必须检查 Keil 编译器手册中有关实现定义行为的信息。我不知道从那时起生成的函数指针将有什么有意义的用途。

因为地址9当然不是 ARM 上的对齐地址。相反,它是我期望找到不可屏蔽中断 ISR 或类似中断的地址的 1 个字节。那么你到底想在这里做什么?从向量表中获取 ISR 的地址?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将子程序的地址转换为 void 指针 的相关文章

随机推荐