Попытка понять printf указатель со спецификатором char (%c)
#include<stdio.h>
void main()
{
int n = 2;
printf("%c",&n);
}
Выход: L
По использованию %d
он конечно дает адрес переменной n
но почему он выводит L при использовании %c
?
3 ответа
Это неопределенное поведение, потому что вы использовали неправильный спецификатор формата.
Стандарт С11: 7.21.6.1: пункт 9:
Если спецификация преобразования недопустима, поведение не определено. Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено.
Это означает, что все может случиться, если printf
вызывается с неверным спецификатором формата.
Как сказал другой ответ rsp, поведение не определено и может произойти все что угодно.
В вашем случае происходит следующее:
Это читает один байт &n
потому что символ имеет размер одного байта, который в основном имеет длину 8 бит, см. CHAR_BIT
объяснение на SO. Затем он печатает его как символ.
Этот байт может быть первым байтом &n
если типы int*
а также int
одинаковы на вашей машине. Это будет означать, что ваша переменная n
лежит по адресу 0x48...
(big-endian) или 0x...48
(little-endian) как 0x48
является H
в коде Аскки. Я предполагаю, что ваша программа использует Ascii для кодирования, которое не обязательно должно.
(Вы изменили персонажа из H
в L
но я оставляю этот ответ как есть.)
Также этот байт может лежать где-то посередине &n
если int*
превышает размер int
в вашей системе.
Вы должны скомпилировать с большим количеством включенных предупреждений, например -Wall
в gcc и вы получите:
предупреждение: формат "% c" ожидает аргумент типа "int", но аргумент 2 имеет тип "int *" [-Wformat=]
В случае, если вы приведете это значение к char
поведение будет хорошо определено, но полагаться на реализацию, поскольку приведение типа указателя к целому числу определяется реализацией.
Тем не менее, то, что вы делаете, не имеет смысла, и с актерами это не подойдет.
Это потому, что вы указали функции printf() показывать первый 1-байт адреса int n в виде символа.