可变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()会起作用,什么时候会失败呢?
你的代码并没有“真正起作用”。 您的代码调用未定义的行为,任何事情都可能发生,因此没有人可以回答这个问题。 在这里你很幸运,但下次也许不是。