(ноль) Указатель в C/C ++
-
13-10-2019 - |
Вопрос
Я работаю над проектом и продолжаю находить эту ошибку, которая не позволит мне завершить проект. Когда я инициализирую одно из моих указателей, чтобы указывать на объект, который будет создан во время выполнения программы, и инициализации его в NULL
. Анкет Затем, когда я проверю, чтобы увидеть, что он установлен на него, возвращает значение nil
. Анкет Как это возможно? Я не поверил, что указатели NIL существовали в C. Есть ли это способ обойти это?
struct order_line *front = NULL;
...
printf("Head: %p\n", front); // prints -> Head: (nil)
Решение
%p
в printf
Форматирует тип указателя. Это будет отличить нулевый указатель и печатать (nil)
Потому что это особое значение в контексте указателя. Если вы хотите вывести 0 для нулевого указателя, отмените указатель на целое число и используйте %d
вместо:
printf("Head: %d\n", (int) front);
Оригинальный ответ, так как он все еще может быть полезен:
NULL
макрос определяется как 0
или же ((void *) 0)
, так что если вы установите указатель на NULL
это точно так же, как настройка на 0
. Анкет Это работает для целей объявления нулевых указателей, потому что память на адресе 0 никогда не будет выделена на вашу программу.
Другие советы
Когда вы печатаете указатель, используя printf("%p", somePtr)
, он напечатан в Реализация, определенная манера, согласно этой цитате из POSIX PRINTF Спецификация (Аналогичная формулировка существует также в спецификации C99).
Аргумент должен быть указателем на пустоту. Значение указателя преобразуется в последовательность печатных символов в зависимости от реализации.
Я думаю, это означает, что если указатель NULL
, он может распечатать его так, как хочет, включая печать как nil
или же 0x00000000
или же 0
.
использовать
printf("Head: %s, %d, %p\n", front, front, front);
печатать Head: (null), 0, (nil)
Спасибо Packia
Я предполагаю, что ноль - это то, что говорит ваш отладчик. В большинстве компиляторов NULL просто #Define ED до 0 в любом случае, так что это имя не так важно.
Как заявили другие, в C. нет такого понятия, как ниль указатель.
Может быть ваше распределение памяти не удается, вызывая 0
быть назначенным указателю.
Если ваш вопрос о сравнении значения указателя с NULL, то значение, напечатанное printf (), не должно иметь значения. Вы все еще можете сделать if (ptr == null) для этого.
- ptr = (nil) и null = (nil) => ptr = null :)
Ошибка, которую вы получаете, должна по какой -то другой причине.
После приготовления указателя структуры с помощью 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
Он будет оцениваться как false для условия.