Ну, нет никакого портативного способа добиться этого в языке C. Язык C не предоставляет переносимых функций, специально предназначенных для наведения указателя на конкретный числовой адрес. Однако «секретное» намерение явного преобразования целых чисел в указатель на самом деле заключается в следующем: реализовать «естественное» отображение между целыми числами и указателями, где «естественное» обычно означает, что числовое значение целого числа сохраняется в неизменном (если возможно) при преобразовании в тип указателя. Другими словами, все, что вам нужно, это целое число со значением 0
. Вам просто нужно убедиться, что это целое число не квалифицируется как выражение интегральной константы, так как в противном случае оно будет распознано как константа нулевого указателя. (Проще говоря, вам нужен интегральный ноль времени выполнения, а не интегральный ноль времени компиляции).
Например, это
uintptr_t i = 0;
void *p = (void *) i;
обычно создает указатель на адрес 0
. Более того, в языке C (в отличие от C ++) это
const uintptr_t i = 0;
void *p = (void *) i;
также обычно создает указатель на адрес 0
. Пока это
void *p = 0; /* compile-time 0 will not do */
создаст значение нулевого указателя для конкретной реализации.
Вы также можете взглянуть на C FAQ здесь , который охватывает именно эту проблему.