С GCC 4.3.4, с помощью переключателей -O2 -Wstrict ступенчатости, ответ dreamlax будет производить:
warning: dereferencing type-punned pointer will break strict-aliasing rules
Добавлено: Я думаю, что возражения против ответа CAF в о байтов и размера являются разумными, решение которых не рассматривается (каламбур не предназначен). Предложение Дастина о применении объединенного актера, вероятно, является законным (хотя из того, что я прочитал, похоже, есть некоторые дебаты, но ваш компилятор делает, что важно, чем закон). Но его код может быть упрощен (или затемненным, в зависимости от вашего вкуса) по однострочнику: (?, Но это «правильный»)
printf("%p\n", ((union {int (*from)(void); void *to;})funcptr).to);
Это снимает ССАГПЗ предупреждения строгого сглаживания.
Совокупные отбрасывания не будут работать, если вы используете -специальный переключатель или используете, например, SGI IRIX, так что вам нужно использовать:
printf("%p\n", ((union {int (*from)(void); void *to;} *)&funcptr)->to);
Но относительно оригинальный вопрос: его происхождение лежит в использовании -pedantic, который я думаю, немного педантичный :).
Дальнейшее редактирование: Примечание Вы не можете использовать основной в последнем примере, как и в:
printf("%p\n", ((union {int (*from)(void); void *to;}) main).to); // ok
printf("%p\n", ((union {int (*from)(void); void *to;} *)&main)->to); // wrong!
потому что, конечно & главный распадается на основной.
Ну, я собирался принять ответ, который работал, пока он не был удален (хотя это не имеет смысла). –
Можете ли вы преобразовать его в int (или 64-битный int в больших системах) и вместо этого напечатать? –
@Michael Dorgan: Приведение указателя к целочисленному типу, отличному от 'intptr_t' или' uintptr_t', определяется реализацией, однако реализация этих типов является необязательной в соответствии со стандартом. – dreamlax