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

2013-04-03 15:15:06 +08:00
 zeroten
想写一个变长参数列表的函数,我想把包括第一个参数在内的参数做同样处理,比如赋值。比如我写一个函数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;
}
2944 次点击
所在节点    问与答
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)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/64854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX