Использование %p
для печати void *
является правильным, но результат от %p
определяется реализацией (поэтому он задокументирован), и он варьируется между платформами. В частности, некоторые платформы выводят ведущий 0x
, некоторые нет. Я думаю, что все они используют шестнадцатеричный, но даже это не является обязательным (printf()
):
p
Аргумент должен быть указателем на void
. Значение указателя равно , преобразованному в последовательность символов печати, в порядке реализации .
Альтернатива использует C99 средство от <inttypes.h>
:
printf("0x%08" PRIXPTR "\n", (uintptr_t)argv);
Технически uintptr_t
является необязательным типом. На практике я не знаю системы, в которой она недоступна (но некоторые мейнфреймы или аналогичные компьютеры были бы вероятными кандидатами, если есть исключение). Это позволяет вам управлять форматом - мне нравится верхний регистр гексагона, за исключением ведущего падения 0xFEDCBA987654321
, поскольку он равномерен, тогда как 0xfedcba
имеет провалы для a
, c
и e
. YMMV!
Зачем вам лгать вашему компилятору? 'argv' является' char ** ', а не' unsigned int', поэтому используется для 'void *' и используется ''% p "' вместо ''% x''. – EOF
Я знаю _print значение 'argv'_ - это то, что вы сказали, и все комментарии и ответы адресуются, но возможно ли, что вы действительно намеревались задать _print значение, содержащееся в' argv'_? – ryyker
@ryyker, возможно, вас не часто интересует *, где * предоставленный массив 'char *' содержится в памяти. –