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

无符号字符中的C变量参数?,c,variadic-functions,C,Variadic Functions,我阅读本页了解如何使用变量参数: 好的,整数结果是可以的。 但当我将其类型替换为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

我阅读本页了解如何使用变量参数:

好的,整数结果是可以的。 但当我将其类型替换为
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');
}

对于
int
版本,一切都是一样的,但是为什么结果会不同呢?

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


va_start(valist,num)
初始化
valist
num
之后的参数开始。在对
foo
bar
的两个函数调用中,
'a'
位于
num
的位置,因此
va_arg
中的第一个值将是
'b'
,它是98位十进制数,或者62位十六进制数。

也许我不明白您试图用代码做什么,但是,您不只是将
'a'
作为函数
条的参数数发送给函数吗?通常,它是字符代码97?所以它尝试打印97个参数

va_start(valist,num)
初始化
valist
num
之后的参数开始。在对
foo
bar
的两个函数调用中,
'a'
位于
num
的位置,因此
va_arg
中的第一个值将是
'b'
,即98位十进制或62位十六进制。

替换:

va_start(valist, num);

foo
中,将其原型更改为:

void foo(unsigned char arg_count, ...) 
您声明了3个参数,但从末尾开始了va_列表2

还有,改变这个

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

main
中。您省略了
num
参数。

替换:

va_start(valist, num);

foo
中,将其原型更改为:

void foo(unsigned char arg_count, ...) 
您声明了3个参数,但从末尾开始了va_列表2

还有,改变这个

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


main
中。您省略了
num
参数。

“当我替换其类型时”是什么类型?哪里?你好像误解了。您的注释“initialize valist for num number of arguments”是错误的。语句
va_start(valist,num)
仅使用
num
查找第一个变量参数,在
for
循环中使用它之前,它不会使用它的数值。该特定教程的措辞有误导性。给你找一个不同的。特别是,“省略号前的一个始终是int”这一说法具有强烈的误导性。它不必是
int
,也不必表示传递的变量参数总数。碰巧这个特定函数选择使用这些约定。语言中没有任何东西可以强制它们或凭空创建varargs计数。好了,伙计们,我知道
num
不是变量参数的计数。但是回到话题上来,我应该如何理解每一个论点?@naive231:我不明白你的问题。你想做什么?把所有的论点都打印出来?您需要一些方法来告诉varargs函数您有多少个参数。两种方法是将数字作为第一个参数发送,或者使用一个特殊值标记参数列表的结尾。没有获取参数数量的内置机制。这就是问题吗?“当我替换它的类型”什么是类型?哪里?你好像误解了。您的注释“initialize valist for num number of arguments”是错误的。语句
va_start(valist,num)
仅使用
num
查找第一个变量参数,在
for
循环中使用它之前,它不会使用它的数值。该特定教程的措辞有误导性。给你找一个不同的。特别是,“省略号前的一个始终是int”这一说法具有强烈的误导性。它不必是
int
,也不必表示传递的变量参数总数。碰巧这个特定函数选择使用这些约定。语言中没有任何东西可以强制它们或凭空创建varargs计数。好了,伙计们,我知道
num
不是变量参数的计数。但是回到话题上来,我应该如何理解每一个论点?@naive231:我不明白你的问题。你想做什么?把所有的论点都打印出来?您需要一些方法来告诉varargs函数您有多少个参数。两种方法是将数字作为第一个参数发送,或者使用一个特殊值标记参数列表的结尾。没有获取参数数量的内置机制。这就是问题所在吗?