В недавнем вопросе кто-то упомянул, что при печати значения указателя с помощью 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)
создадут тот же самый стек-фрейм. Когда два вызова генерируют разные кадры стека?