В недавнем вопросе кто-то упомянул, что при печати значения указателя с помощью printf вызывающий должен наложить указатель на void *, например:
int *my_ptr = ....
printf("My pointer is: %p", (void *)my_ptr);
В жизни я не могу понять, почему. Я нашел этот вопрос, который почти такой же. Ответ на вопрос правильный - он объясняет, что ints и указатели не обязательно имеют одинаковую длину.
Это, конечно, верно, но когда у меня уже есть указатель, как в приведенном выше случае, почему я должен отбрасывать от int * до void *? Когда int * отличается от void *? Фактически, когда (void *)my_ptr генерирует любой машинный код, отличный от простого my_ptr?
UPDATE:
Несколько квалифицированных респондентов цитировали стандарт, говоря, что передача неправильного типа может привести к поведению undefined. Как? Я ожидаю, что printf("%p", (int *)ptr) и printf("%p", (void *)ptr) создадут тот же самый стек-фрейм. Когда два вызова генерируют разные кадры стека?