Как установить указатель на нулевое место? - PullRequest
2 голосов
/ 10 марта 2010

Насколько мне известно, все вхождения NULL в коде заменяются на 0 на этапе предварительной обработки. Затем во время компиляции все вхождения 0 в контексте указателя заменяются соответствующим значением, которое представляет NULL на этом компьютере. Таким образом, компилятор должен знать, что значение NULL для этой конкретной машины.
Теперь, это означает, что всякий раз, когда я использую 0 в контексте указателя, оно заменяется соответствующим значением, представляющим NULL на этой машине, которое может быть или не быть 0. Итак, как я могу сказать компилятору, что я на самом деле имею в виду 0, а не NULL , когда я использую 0 в контексте указателя?
Извините за длинное описание. Поправь меня, если я не прав

Ответы [ 2 ]

5 голосов
/ 10 марта 2010

Один из способов - сохранить все нулевые биты в вашем указателе:

void* zero;
memset(&zero, 0, sizeof(zero));
3 голосов
/ 10 марта 2010

Ну, нет никакого портативного способа добиться этого в языке 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 здесь , который охватывает именно эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...