В C невозможно получить доступ к элементам данных в единицах, меньших 8 бит, так как наименьший возможный тип - char
, который имеет CHAR_BIT
бит, что по меньшей мере 8. Битовые поля являются исключением, но не допускают указателей на их члены; указатель данных с суб- (8-) байтовой точностью не может существовать в C.
Однако инструкции (и, следовательно, функции) могут храниться по-разному, а указатели на функции могли бы имеют суббайтовую точность. В общем, указатели функций и указатели данных не являются взаимозаменяемыми, поэтому вы не можете (правильно) хранить такой указатель функции в указателе void*
. C не поддерживает доступ к машинному коду в любом случае, поэтому не будет поддержки доступа к инструкциям, имеющим выравнивание и / или размер суббайтов.
Даже на платформах с размером как минимум байтовых инструкций & выравнивание, указатели функций и указатели данных могут не быть взаимозаменяемыми, поскольку указатели функций могут быть больше или меньше указателей данных (представьте себе систему с 256 байтами ОЗУ для данных и 64 КБ fla sh байтов для памяти программ). Следовательно, C не гарантирует, что void*
может указывать на все. Однако некоторые платформы, такие как POSIX do , явно разрешают это, например, для работы dlsym()
.