我通常用C++编写代码,但我正在用C编写一个项目,我遇到了一个语法如下的printf:
printf( 0, "%d\n", num);
我到处看了看,找不到一个解释printf中的第一个0是做什么的。有人能给我解释一下吗?谢谢。
puruo6ea1#
因为xv6没有使用标准库中的printf。第一个参数是一个文件描述符,指示要写入哪个流:
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; } } }
nzkunb0c2#
它是undefined behavior;我猜你可能有一个分段违规。
biswetbf3#
调用未定义的行为,因为printf的第一个参数必须是指向字符串的指针。
3条答案
按热度按时间puruo6ea1#
因为xv6没有使用标准库中的
printf
。第一个参数是一个文件描述符,指示要写入哪个流:nzkunb0c2#
它是undefined behavior;我猜你可能有一个分段违规。
biswetbf3#
调用未定义的行为,因为
printf
的第一个参数必须是指向字符串的指针。