проблема с функцией printf () - PullRequest
       20

проблема с функцией printf ()

0 голосов
/ 18 сентября 2011

Вот моя программа:

#include <stdio.h>
int main()
{
    int a=0x09;
    int b=0x10;
    unsigned long long c=0x123456;
    printf("%x %llx\n",a,b,c);//in "%llx", l is lowercase of 'L', not digit 1
    return 0;
}

вывод был:

9 12345600000010

Я хочу знать:

  1. как работает функция printf ()казнят?
  2. что произойдет, если количество аргументов не равно количеству аргументов?

, пожалуйста, помогите мне и используйте эту программу в качестве примера для объяснения.

Ответы [ 3 ]

2 голосов
/ 18 сентября 2011

Проблема в том, что ваши типы не совпадают. Это неопределенное поведение.

Ваш второй аргумент b не соответствует типу формата. Таким образом, происходит то, что printf() читает за 4 байта, содержащие b (printf ожидает 8-байтовый операнд, но b - это только 4 байта). Поэтому вы получаете мусор. Третий аргумент вообще не печатается, так как ваш printf() имеет только 2 кода формата.

Поскольку аргументы обычно передаются последовательно (и смежно) в памяти, 4 дополнительных байта, которые читает printf(), на самом деле являются младшими 4 байтами c.

Итак, в конце второе напечатанное число равно b + ((c & 0xffffffff) << 32).

Но я хочу повторить: это поведение не определено . Просто сегодня большинство систем ведут себя так.

1 голос
/ 18 сентября 2011

Если аргументы, которые вы передаете printf, не соответствуют спецификации формата, вы получите неопределенное поведение .Это означает, что все может произойти, и вы не можете рассуждать о результатах, которые вы видите в вашей конкретной системе.

В вашем случае для %llx требуется аргумент типа unsigned long long, но вы указали int.Это само по себе вызывает неопределенное поведение.

Передача большего числа аргументов printf не является ошибкой, чем спецификаторов формата, избыточные аргументы оцениваются, но игнорируются.

0 голосов
/ 18 сентября 2011

printf() увеличивает указатель для чтения аргумента за раз в соответствии с форматом. Если количество аргументов форматирования больше, чем количество параметров, то printf () выведет данные из неизвестных областей памяти. Но если количество параметров больше, чем количество аргументов форматирования, то никакого вреда не было. Например. gcc предупредит вас, если количество аргументов и параметров форматирования не совпадают.

...