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

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

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

7 ответов


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

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

оригинальный ответ, поскольку он все еще может быть полезен:

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


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

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

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


использовать

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

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

спасибо Packia


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

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


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

    ptr = (nil) и NULL = (nil) => ptr = NULL :)

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

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


после приведения указателя структуры с помощью 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 - - - после удаления-- nil Адрес переменной - - - ps - >p - - - после удаления-- 0

он будет равен false для условия if .