va_arg给出运行时错误

va_arg gives Runtime Error

本文关键字:运行时错误 arg va      更新时间:2023-10-16

我试图写一个小函数,需要一个格式字符串和一些可变数值参数。格式字符串接受表示不同数字类型的各种字符(c表示char, i表示int, d表示double,等等),然后对于字符串中的每个字符接受该类型的数字。然后它返回所有这些数字的和。一个示例调用看起来像这样:

addEm("cid", 'A', 4, 5.0)

这将返回74,使用计算

中的'A'的ascii码。

函数是这样的:

double addEm(char *format, ...) {
   va_list params;
   va_start(params,format);
   double ret=0;
   while(*format) {
      switch(*format++) {
         case 'c':
            ret+=(double)(va_arg(params, char));
            break;
         case 'd':
            ret+=va_arg(params, double);
            break;
         case 'i':
            ret+=(double)(va_arg(params, int));
            break;
         case 's':
            ret+=(double)(va_arg(params, short));
            break;
         case 'f':
            ret+=(double)(va_arg(params, float));
            break;
      } 
   }
   va_end(params);
   return ret;
}

但是当我运行像上面这样的调用时,它会产生一个错误,而且我似乎不知道为什么。有人能看出我哪里做错了吗?谢谢!

试试这个:

double addEm(char *format, ...) {
    va_list params;
    va_start(params,format);
    double ret=0;
    while(*format) {
        switch(*format++) {
            case 'c':
                ret+=(double)(va_arg(params, int));
                break;
            case 'd':
                ret+=va_arg(params, double);
                break;
            case 'i':
                ret+=(double)(va_arg(params, int));
                break;
            case 's':
                ret+=(double)(va_arg(params, int));
                break;
            case 'f':
                ret+=(double)(va_arg(params, double));
                break;
        } 
    }
    va_end(params);
    return ret;
}

以下是一些可能有用的gcc警告:

t038.c:12:19: warning: ‘char’ is promoted to ‘int’ when passed through ‘...’ [enabled by default]
t038.c:12:19: note: (so you should pass ‘int’ not ‘char’ to ‘va_arg’)
t038.c:12:19: note: if this code is reached, the program will abort
t038.c:21:19: warning: ‘short int’ is promoted to ‘int’ when passed through ‘...’ [enabled by default]
t038.c:21:19: note: if this code is reached, the program will abort
t038.c:24:19: warning: ‘float’ is promoted to ‘double’ when passed through ‘...’ [enabled by default]
t038.c:24:19: note: if this code is reached, the program will abort