Оба предыдущих ответа показали, почему код не переносим в соответствии со стандартом.Я просто хочу добавить пример, где это может пойти плохо.
Предположим, что для цели int*
не имеет того же представления, что и void*
, а void*
имеет значение ловушки.
Теперь ptr
присваивается значение из void*
, и представление битов автоматически изменяется неявным преобразованием.
Предположим, что битовая комбинация, хранящаяся в ptr
, точно соответствует битовой комбинации для представления прерываний для void*
Теперь вы передали &ptr
, где ожидается void**
с использованием явногобросать.Когда wrapper_free
пытается разыменовать p
(как void*
), он разыменовывает значение ловушки, и ничего нельзя предсказать о поведении программы за этой точкой.
Вместо этого, если вы создадите временную переменную типа void*
и присвоите ей int*
, произойдет преобразование обратно из int*
в void*
, и вы гарантированно не попадете в бит ловушки.представление.
Надеюсь, это поможет лучше понять проблему.