无符号字符中的C变量参数?

时间:2017-10-31 09:54:26

标签: c variadic-functions

我阅读此页面以了解如何使用变量参数: https://www.tutorialspoint.com/cprogramming/c_variable_arguments.htm

好吧,整数结果还可以。 但当我将其类型替换为unsigned char时,一切都会出错:

#include <stdio.h>
#include <stdarg.h>

double average(int num,...) {

   va_list valist;
   double sum = 0.0;
   int i;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < num; i++) {
      sum += va_arg(valist, int);
   }

   /* clean memory reserved for valist */
   va_end(valist);

   return sum/num;
}

void foo(unsigned char arg_count,int num,...) {

   va_list valist;
   int i;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < arg_count; i++) {
      printf("%02x,",va_arg(valist, int));
   }

   /* clean memory reserved for valist */
   va_end(valist);
}

void bar(int num,...) {

   va_list valist;
   int i;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < num; i++) {
      printf("%02x,",va_arg(valist, int));
   }

   /* clean memory reserved for valist */
   va_end(valist);
}

int main() {
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
   foo(3,'a','b','c');
   printf("\n");
   bar('a','b','c');
}

结果如下:

Compiling the source code....
$gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1

Executing the program....
$demo 
Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
62,63,400aab,
62,63,00,0a,c0a4700,4009e0,b0ef50a,01,64f5ead8,40000,400934,00,440c7120,400540,64f5ead0,00,00,83cc7120,be487120,00,00,00,bea8d73,be96d10,b6b9950,00,00,00,400540,64f5ead0,40056a,64f5eac8,c0c0180,01,64f5f3d3,00,64f5f3d8,64f5f473,64f5f48d,64f5f4a9,64f5f4b2,64f5f4c8,64f5f4e5,64f5f50d,64f5f796,64f5f7af,64f5f7d9,64f5f7f8,64f5f802,64f5f80a,64f5f823,64f5f83b,64f5f850,64f5f876,64f5f87e,64f5f898,64f5f8d0,64f5f8db,64f5f8e3,64f5f946,64f5f972,64f5f998,64f5fa2d,64f5fa63,64f5fa79,64f5ff2f,64f5ffc9,00,21,64fdb000,10,bfebfbff,06,1000,11,64,03,400040,04,38,05,09,07,be98000,08,00,09,400540,0b,30,0c,30,0d,30,0e,30,17,

int版本的所有内容都是一样的,但为什么结果会有所不同?

2 个答案:

答案 0 :(得分:3)

也许我不明白你试图用你的代码做什么,但你不是要发送'a',通常是字符代码97,作为函数bar的参数个数?所以它试图打印97个参数。

va_start(valist, num)初始化valistnum之后的参数开头。在foobar的函数调用中,'a'位于num的位置,因此va_arg的第一个值为'b' },这是98十进制,或62十六进制。

答案 1 :(得分:3)

替换:

va_start(valist, num);

va_start(valist, arg_count);
foo

并将其原型更改为:

void foo(unsigned char arg_count, ...) 

你声明了3个参数,但是从最后开始了va_list 2.

另外,请更改此

bar('a','b','c');

为:

bar(3, 'a','b','c');
main中的

。您已省略num参数。