V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zeroten
V2EX  ›  问与答

c语言变长参数问题,怎么处理第一个参数?

  •  
  •   zeroten · 2013-04-03 15:15:06 +08:00 · 2924 次点击
    这是一个创建于 4253 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想写一个变长参数列表的函数,我想把包括第一个参数在内的参数做同样处理,比如赋值。比如我写一个函数func,功能是把第1个参数到第N个参数一次赋值1~n。第1个参数fmt,我把它单独赋值1。程序如下,编译通过,运行出错。

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

    void func(int *fmt,...)
    {
    va_list ap;
    int i=1,*ival;

    va_start(ap,fmt);

    *fmt=i++;

    while((ival=va_arg(ap,int *))!=NULL)
    {
    *ival=i++;
    }
    va_end(ap);
    }

    int main()
    {
    int a,b,c,d;
    func(&a,&b,&c,&d);
    printf("%d,%d,%d,%d\n",a,b,c,d);
    return 0;
    }
    1 条回复    1970-01-01 08:00:00 +08:00
    Cofyc
        1
    Cofyc  
       2013-04-03 15:44:48 +08:00
    不能用判断是否为 NULL 来确定参数列表是否结束。(虽然有些情况会执行正确,切好当参数列表后面的内存块值为空时)

    因为 C 的可变参数不像 python 之类的传递的是一个 list 或 dict 对象(可以获取参数列表的长度与类型),而只是传递一个起始地址。之后有多少参数,每个参数是什么类型是由程序去判断并处理的。

    比如 printf 需要第一个参数为 format 字符串表明后面参数依次是什么类型。比如:

    printf("%s: %d", ...) 接受一个字符串和一个整数

    你可以将 func 设计成第一个参数接受一个整数,表明后面有多少个整数去处理。比如:

    void func(int num,...)

    然后,程序里面

    int i;
    for (i = 0; i < num; i++) {
    // ..
    }

    这样去处理。

    使用:func(4, &a, &b, &c, &d)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2779 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:18 · PVG 15:18 · LAX 23:18 · JFK 02:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.