zeroten
V2EX  ›  问与答

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

  •  
  •   zeroten · Apr 3, 2013 · 3485 views
    This topic created in 4813 days ago, the information mentioned may be changed or developed.
    想写一个变长参数列表的函数,我想把包括第一个参数在内的参数做同样处理,比如赋值。比如我写一个函数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 replies    1970-01-01 08:00:00 +08:00
    Cofyc
        1
    Cofyc  
       Apr 3, 2013
    不能用判断是否为 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)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   813 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:32 · PVG 05:32 · LAX 14:32 · JFK 17:32
    ♥ Do have faith in what you're doing.