【发布时间】:2018-04-13 10:00:43
【问题描述】:
如果我定义了一个可变参数函数:
#include <stdio.h>
#include <stdarg.h>
int f(char*s,...)
{
va_list ap;
int i=0;
va_start(ap, s);
while(s)
{
printf("%s ", s);
i++;
s=va_arg(ap,char*);
}
va_end(ap);
return i;
}
int main()
{
return f("a","b",0);
}
gcc (linux x64) 编译它,exe 运行并打印“a b”。
是否需要这样的演员表:
return f("a","b",(char*)0)
在通用系统上?
【问题讨论】:
-
考虑到
sizeof(0)可能,在 64 位系统上,它小于sizeof((char*)0)。 -
是的,因为这是一个 varargs 函数,所以需要强制转换:调用者需要知道要传递(“push”)到函数的参数的类型/大小。 (例如,参见
execl()和execlp()) -
@joop 是在 linux x64 上“推送”的可变参数?
-
我引用了“push”这个词,因为C不需要堆栈。 x64 可能会使用具有 32 位或 64 位对齐要求的堆栈。 (但这都是依赖于实现的)
-
无论你做什么,可变参数函数都是非常不安全的,所以在使用它们时没有好的做法。好的做法是首先不要使用可变参数函数。它们的存在是不良程序设计的某种迹象。
标签: c variadic-functions