注册 登录
编程论坛 Linux教室

自写printf函数遇到的问题,可变参

明明白白 发布于 2012-11-17 12:37, 1718 次点击
#include<stdio.h>
#include<stdarg.h>

void myPrintf(const char *formatStr,...);

void myPrintf(const char *formatStr,...)
{
        va_list begin;
        char ch;
        int i;
        int dh;
        va_start(begin,formatStr);
        for(i = 0;formatStr[i];i++)
        {
                if(formatStr[i] == '%')
                {
                        i++;
                        switch (formatStr[i])
                        {
                                        case 'c':
//提示下面这一行有错误
//myPrintf.c:21:11: warning: ‘char’ is promoted to ‘int’ when passed through ‘...’ //[enabled by default]
//myPrintf.c:21:11: note: (so you should pass ‘int’ not ‘char’ to ‘va_arg’)
//myPrintf.c:21:11: note: if this code is reached, the program will abort

/*******有错误的一行*/                  ch = va_arg(begin,char);
                                        putchar(ch);
                                        break;
                        }
                }
                else
                putchar(formatStr[i]);
        }

}

int main(void)
{
        char first = 'g';
        myPrintf("abcdef%c",first);
        return 0;
}

~                       
5 回复
#2
青春无限2012-11-17 13:31
看看
#3
pangding2012-11-19 13:29
它就是说 char 在传参数的时候会被提升成 int,叫你不要直接读 char。你改改试试呗,我已经记不太清楚细节了。
#4
tauke_wang2012-11-21 15:20
这时系统在存变量时的对齐方式,变量在内存中的位数对齐,对于char,只需要一个字节,但但会分配4个字节,和int对齐,其他的3的字节留白,也就是空闲
#5
pangding2012-11-21 21:24
回复 5楼 tauke_wang
这个和对齐没关系,是参数传递时的提升规则。
1