可变C函数中的空值

如果我定义了一个可变函数:

#include  #include  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运行并打印“ab”。

有没有需要像这样的演员:

 return f("a","b",(char*)0) 

在共同的系统上?

您的代码应该可以在任何支持SYSV x64 ABI标准的系统上正常运行 。 它可能适用于使用具有类似要求的其他ABI标准的系统,并且可能在使用其他ABI 1的任何系统上失败。 根据C标准,这一切都是未定义的。


1 特别是,Microsoft不遵循标准的x64 ABI,它们有自己的标准。

编译器无法自动提升variadic参数的指针,例如,为什么要在printf打印指针时必须将其转换为void *

 printf("%p", (void *)ptr); 

同样的规则适用于所有可变参数函数,编译器不能知道你的函数期望一个char * ,0默认只是一个整数所以是的你需要把它(char *)0


必须使用函数(char *)NULL


那么为什么main()会起作用,什么时候会失败呢?

你的代码并没有“真正起作用”。 您的代码调用未定义的行为,任何事情都可能发生,因此没有人可以回答这个问题。 在这里你很幸运,但下次也许不是。