unsigned char 中的 C 变量参数?

标签 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 版本一切都一样,但为什么结果不同?

最佳答案

替换:

va_start(valist, num);

va_start(valist, arg_count);

foo 中并将其原型(prototype)更改为:

void foo(unsigned char arg_count, ...) 

您要声明 3 个参数,但从末尾开始 va_list 2。

另外,改变这个

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

到:

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

main 中。您省略了 num 参数。

关于unsigned char 中的 C 变量参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47032403/

相关文章:

c - 对 2D 数组使用 malloc 时出现段错误

逐字符复制一行文件

c++ - 主函数体未检测到对重载可变参数模板函数 C++ 的调用

计算 C 变量参数方法调用中的参数个数

c++ - 可变参数模板函数是否以相反的顺序调用 lambda 参数?

具有可变参数 (...) 的 C++ 方法报告不正确的 arg 值

c++ - 带有不带格式字符串的可变参数的 C++ 调试宏

c - 如何使用C在 header 中连接多个结构体?

C 编程 : Convert Hex Int to Char*

c - 如何在 x86-64 下保留参数/参数寄存器?