Печать значения указателей - PullRequest
2 голосов
/ 24 марта 2011
#include <stdio.h>

int main(void)
{
   int x = 99;
   int *pt1;

   pt1 = &x;

   printf("Value at p1: %d\n", *pt1);
   printf("Address of p1 (with %%p): %p\n", pt1);
   printf("Address of p1 (with %%d): %d\n", pt1);

   return 0;
}

Каковы недостатки / опасности для значений указателя принтера с %d вместо %p?

Ответы [ 5 ]

5 голосов
/ 24 марта 2011

% d отображает целое число - нет необходимости, чтобы размер указателя равнялся размеру целого числа.

4 голосов
/ 24 марта 2011
  • sizeof (int *) не обязательно должен быть равен sizeof (int)

  • реализация библиотеки может свободно использовать другое, более подходящее представление значения указателя (например, шестнадцатеричное представление).

  • % p - это просто "правильная вещь". Это то, что стандарт говорит, что следует использовать для указателей, в то время как использование% d неправильно использует целочисленный спецификатор.

Представьте себе, что происходит, когда кто-то реорганизует ваш код и с некоторым энтузиазмом обменивает все "int" на "long" и все "% d" на "% ld" ... упс.

2 голосов
/ 24 марта 2011

Если в вашей системе указатели не совпадают с размером int с, вы можете вызвать неограниченное количество завинчивания.Если они имеют одинаковый размер, то вы, вероятно, в безопасности.Что касается стандартов языка идти, хотя, передавая указатель и рассматривать его как целое разрешается поджигать ваш компьютер, отправить по электронной почте порнографической к вашему боссу, или вызвать демон, чтобы летать из носа.Вероятно, он не будет делать ничего из этого, но он мог бы распечатать вводящие в заблуждение значения или что-то в этом роде.

Не делайте этого.Используйте %p, если у вас нет острой необходимости рассматривать адрес как целое число (примечание: вы, вероятно, не);в этом случае фактически приводит его к целочисленному типу , чтобы не злоупотреблять механизмом передачи аргументов.

0 голосов
/ 24 марта 2011

В дополнение к опасностям, указанным в других ответах, некоторые компиляторы (например, gcc с включенными предупреждениями форматной строки) генерируют предупреждение о том, что вы передаете указатель на %d, который ожидает int.

0 голосов
/ 24 марта 2011

Я не знаю об опасностях и недостатках, но, используя нотацию% d, вы теряете форматирование для указателя, например (12 против 0x000012).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...