Я прочитал много ответов об использовании спецификатора формата %p
на языке C здесь, в Stack Overflow, но ни один из них не дает объяснения, почему явный приведение в void*
необходимо для всех типов, но char*
.
Я, конечно, знаю о том, что это требование приведения к или из void*
связано с использованием вариационных функций (см. Первый комментарий этого ответа), в то время как необязательно в противном случае.
Вот пример:
int i;
printf ("%p", &i);
Выдает предупреждение о несовместимости типа и что &i
должен быть отброшен в void*
(как требуется стандартом, см. Здесь снова).
В то время как этот кусок кода компилируется плавно без каких-либо претензий на литье типов:
char * m = "Hello";
printf ("%p", m);
Как это происходит, когда char*
"освобождается" от этого императива?
PS: Возможно, стоит добавить, что я работаю над архитектурой x86_64, поскольку размер этого типа зависит от него, а с помощью gcc как компилятора на Linux с -W -Wall -std=c11 -pedantic
параметры компиляции.