Попытка понять 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 в виде символа.

Другие вопросы по тегам