尽管函数指针的大小并不总是与不透明指针的大小相同,但可以使用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
整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。
空指针存在一些特殊情况,但不适用于您的情况。
所以,你可以大概投了价值9函数指针-你必须检查有关实现定义Keil编译器手册。从那时起,结果函数指针将具有什么有意义的目的,我不知道。
因为该地址9
在ARM上肯定不是对齐的地址。相反,它比我期望找到不可屏蔽中断ISR或类似地址的地址晚了1个字节。那么,您实际上打算在这里做什么?从向量表中获取ISR的地址?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句