例如,如果架构支持半字节长度指令,但数据是字节对齐的,则将:
* PointerToAnything;
工作?换句话说,编译器可以处理吗?谢谢
最佳答案
在C语言中,不可能以小于8位的单位访问数据元素,因为最小的可能类型是char
,它的CHAR_BIT
位至少为8。位域是一个例外,但是不允许指向其成员的指针。 C中不能存在精度小于(8)字节的数据指针。
但是,指令(以及功能)的存储方式可能不同,功能指针的精度也可以达到亚字节精度。通常,函数指针和数据指针不可互换,因此您不能(正确)将这样的函数指针存储在void*
指针中。 C始终不支持访问机器代码,因此将不支持访问具有亚字节对齐和/或大小的指令。
即使在具有至少字节指令大小和对齐方式的平台上,功能指针和数据指针也可能无法互换,因为功能指针可能大于或小于数据指针(想象一个系统具有256个RAM字节的数据和64kB的Flash字节用于程序存储器)。因此,C不能保证void*
可以指向所有内容。但是,某些平台(例如POSIX)确实明确允许这样做,例如允许dlsym()
上班。