(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 .