0

例如,如果架构支持半字节长度指令,但数据是字节对齐的,将:

void *PointerToAnything;

工作?换句话说,编译器可以处理这个吗?

4

1 回答 1

4

在 C 中,不可能以小于 8 位的单位访问数据元素,因为最小的可能类型是char,它具有CHAR_BIT位,至少为 8。位域是一个例外,但不允许指向其成员的指针;C 中不能存在具有亚 (8-) 字节精度的数据指针。

但是,指令(以及函数)的存储方式可能不同,函数指针可能具有亚字节精度。通常,函数指针和数据指针是不可互换的,因此您不能(正确)将这样的函数指针存储在void*指针中。C 无论如何都不支持访问机器代码,因此不支持访问具有子字节对齐和/或大小的指令。

即使在至少具有字节指令大小和对齐方式的平台上,函数指针和数据指针也可能无法互换,因为函数指针可能大于或小于数据指针(想象一个系统有 256 个 RAM 字节用于数据,64kB 闪存字节用于程序存储器)。因此,C 不保证void*可以指向一切。但是,某些平台(例如 POSIX)确实明确允许这样做,以允许例如dlsym()工作。

于 2020-02-14T11:23:58.220 回答