Вопрос

Я работаю над проектом и продолжаю находить эту ошибку, которая не позволит мне завершить проект. Когда я инициализирую одно из моих указателей, чтобы указывать на объект, который будет создан во время выполнения программы, и инициализации его в 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 для условия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top