(ноль) указатель в C / C ++ - PullRequest
       13

(ноль) указатель в C / C ++

8 голосов
/ 20 января 2011

Я работаю над проектом и продолжаю сталкиваться с этой ошибкой, которая не позволяет мне завершить проект. Когда я инициализирую один из моих указателей, чтобы указать на объект, который будет создан во время выполнения программы, и я инициализирую его как NULL. Затем, когда я проверяю, что он установлен, он возвращает значение nil. Как такое возможно? Я не верил, что нулевые указатели существуют в C. Есть ли способ обойти это?

struct order_line *front = NULL;
...
printf("Head: %p\n", front);  // prints -> Head: (nil)

Ответы [ 7 ]

10 голосов
/ 20 января 2011

%p в printf форматирует тип указателя.Это позволит различить нулевой указатель и вывести (nil), потому что это специальное значение в контексте указателя.Если вы хотите вывести 0 для нулевого указателя, приведите указатель к целому числу и используйте вместо него %d:

printf("Head: %d\n", (int) front);

Исходный ответ, поскольку он все еще может быть полезен:

NULL - это макрос, определенный как 0 или ((void *) 0), поэтому, если вы установите указатель на NULL, это точно так же, как установить его на 0.Это работает с целью объявления нулевых указателей, поскольку память по адресу 0 никогда не будет выделена вашей программе.

3 голосов
/ 20 января 2011

Когда вы печатаете указатель, используя printf("%p", somePtr), он печатается в соответствии с реализацией , в соответствии с этой цитатой из спецификации printf POSIX (аналогичная формулировка существует в Спецификация C99 также).

Аргумент должен быть указателем на void. Значение указателя преобразуется в последовательность печатных символов в зависимости от реализации.

Полагаю, это означает, что если указатель равен NULL, он может распечатать его так, как ему нужно, включая печать как nil или 0x00000000 или 0.

2 голосов
/ 20 января 2011

используйте

printf("Head: %s, %d, %p\n", front, front, front);

для печати Head: (null), 0, (nil)

Спасибо Packia

1 голос
/ 20 января 2011

Я предполагаю, что ноль - это то, что говорит вам ваш отладчик.В большинстве компиляторов значение null в любом случае просто равно #define ed до 0, так что имя не так важно.

0 голосов
/ 06 октября 2013

После приведения указателя структуры к типу int оно обеспечивает ожидаемое условие с помощью оператора if ..

printf("The address of the variable is---ps->p---After Deletion-- %p \n",ps->p);
printf("The address of the variable is---ps->p---After Deletion--  %d \n",(int)ps->p);
if((int)ps->p){
printf("Again in Free\n");
doFree((void **)&ps->p);
}

ВЫХОД: -

Адрес переменной --- ps-> p --- После удаления - ноль Адрес переменной: --- ps-> p --- После удаления-- 0

оценивается как ложное условие if.

0 голосов
/ 20 января 2011

Если ваш вопрос касается сравнения значения указателя с NULL, то значение, напечатанное printf (), не должно иметь значения. Вы все еще можете сделать if (ptr == NULL) для этого.


Ошибка, которую вы получаете, должна быть по какой-то другой причине.
0 голосов
/ 20 января 2011

Как уже говорили другие, в C. не существует такого понятия, как нулевой указатель.

Может произойти сбой выделения памяти, в результате чего указателю будет назначено 0.

...