- 论坛徽章:
- 0
|
本帖最后由 慕冬亮 于 2014-03-06 15:32 编辑
我在看《一个操作系统的实现》这本书的时候,看到io这一章的最后一个例子,我想把书中的printk(书中是printf) 补充一下,但是在实现%s的时候出现了问题,打印出来的字符串和我所说的字符串不同,调试的时候发现地址都不一样。下面让我们先看看函数!
int printk(const char *fmt,...)
{
int i;
char buf[256];
va_list arg = (va_list)((char *)(&fmt) + 4);
i = vsprintk(buf,fmt,arg);
write(buf,i);
return i;
}
int vsprintk(char *buf,char *fmt,va_list args)
{
char *p;
char tmp[256];
va_list p_next_arg = args;
for(p=buf;*fmt;fmt++)
{
if(*fmt != '%')
{
*p++ = *fmt;
continue;
}
fmt++;
switch(*fmt)
{
case 'x':
itoa(tmp,*((int *)p_next_arg));
strcpy(p,tmp);
p_next_arg += 4;
p +=strlen(tmp);
break;
case 's':
strcpy(p,(char *)p_next_arg);
p_next_arg += 4;
p += strlen((char *)p_next_arg);
break;
}
}
return (p-buf);
}
在主调函数中,调用的代码如下:
char test[]="abcd";
printk("%s",test);
结果发现打印的不是abcd,乱七八糟的字符。我在调试的时候将test的值和p_next_arg的值比对,两者竟然不相等,不知道为什么????
补充:va_list 是 typedef char* va_list; |
|