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

标签 c casting embedded function-pointers void

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

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

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

我觉得我应该这样做

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

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

最佳答案

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

在第二种情况下,您有一个轻微的语法错误,应该是(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

An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.

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

因此,您可能将值 9 转换为函数指针 - 您必须检查 Keil 编译器手册中有关实现定义行为的信息。我不知道由此产生的函数指针将具有什么有意义的用途。

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

关于将子程序的地址转换为 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57355248/

相关文章:

javascript - typeof a 的解释是什么,其中 var a = 2 + [] 是字符串?

C++ 禁用静态变量的析构函数

c - 通过中断例程的多个文件传递全局指针

c++ - "."和 "->"运算符的混合链

c++ - 最佳实践 : Where should function comments go in C/C++ code?

c - 值(value)观是什么?

c# - 将类转换为其具有泛型类型的接口(interface)时出错(同时将泛型类型转换为其基类)

c++ - Catch2 强制我将 std::string 的强制转换添加到我的异常中,这会产生其他问题吗?

c - 如何为不断增加的文件连续生成名称?例如: book1. txt、book2.txt等

c - malloc 是否需要操作系统支持?