2015-03-06 4 views
2

Я обычно код в C++, но я работаю над проектом в C, и я наткнулся на Printf со следующим синтаксисом:Что делает 0 в printf (0, "% d", num)?

printf(0, "%d\n", num); 

Я смотрел вокруг и не может найти объяснение того, что первое 0 в printf. Может кто-нибудь, пожалуйста, объясните мне это? Благодарю.

+3

Потому что вы должны получить предупреждения для этого! '[Warning] null аргумент, где не нуль (аргумент 1) [-Wnonnull]' и '[Warning] слишком много аргументов для формата [-Wformat-extra-args]' – Rizier123

+1

Вы уверены, что это не 'fprintf'? –

+1

@PaulR, даже если это было 'fprintf()' одно и то же просто '(FILE *) 0' ... если это' dprintf() ', который печатает в дескриптор файла и указан в ** POSIX.1-2008 **. –

ответ

5

Поскольку xv6 не использует printf из стандартной библиотеки:

void 
printf(int fd, char *fmt, ...) 
{ 
    char *s; 
    int c, i, state; 
    uint *ap; 
    state = 0; 
    ap = (uint*)(void*)&fmt + 1; 
    for(i = 0; fmt[i]; i++){ 
     c = fmt[i] & 0xff; 
     if(state == 0){ 
      if(c == '%'){ 
       state = '%'; 
      } else { 
       putc(fd, c); 
      } 
     } else if(state == '%'){ 
      if(c == 'd'){ 
       printint(fd, *ap, 10, 1); 
       ap++; 
      } else if(c == 'x' || c == 'p'){ 
       printint(fd, *ap, 16, 0); 
       ap++; 
      } else if(c == 's'){ 
       s = (char*)*ap; 
       ap++; 
       if(s == 0) 
        s = "(null)"; 
       while(*s != 0){ 
        putc(fd, *s); 
        s++; 
       } 
      } else if(c == 'c'){ 
       putc(fd, *ap); 
       ap++; 
      } else if(c == '%'){ 
       putc(fd, c); 
      } else { 
      // Unknown % sequence. Print it to draw attention. 
       putc(fd, '%'); 
       putc(fd, c); 
      } 
      state = 0; 
     } 
    } 
} 
+2

** wow ** они действительно использовали это имя для такой функции, даже если есть 'dprintf()', указанный в ** POSIX.1-2008 **? –

+0

А, Ясно спасибо. –

2

Это undefined behavior; Я думаю, у вас может быть нарушение сегментации.

+0

Это компилирует, запускает и печатает инструкцию. Я вижу это в коде для xv6. –

+2

@Caulibrot разыменование указателя «NULL» - неопределенное поведение, поэтому любое поведение возможно, потому что оно ** неопределено **, это может быть ** ошибка сегментации **, или она может работать, или что-то другое, это ** undefined * * ... –

+1

@kamituel Я не думаю, что если бы это было 'write (0 ...' ok, но в этом случае OP передал '0' для строки формата, которая будет разыменоваться без проверки ее на' NULL' в 'printf()'. –

0
printf(0, "%d\n", num); 

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

Смежные вопросы