Я читал, что преобразование указателя функции в указатель данных и наоборот работает на большинстве платформ, но не гарантируется. Почему это так? Разве оба не должны быть просто адресами в основной памяти и, следовательно, быть совместимыми?
void. Преобразование указателя функции в void *не должно изменять представление. void *Значение в результате такого преобразования может быть преобразована обратно в исходный тип указателя функции, используя явное приведение, без потери информации. Примечание . Стандарт ISO C этого не требует, но он необходим для соответствия POSIX.
dlsym()- обратите внимание на конец раздела «Использование приложения», где говорится: Обратите внимание, что преобразование из void *указателя в указатель функции, как в:, fptr = (int (*)(int))dlsym(handle, "my_function"); не определено стандартом ISO C. Этот стандарт требует, чтобы это преобразование работало правильно в соответствующих реализациях.