看变长参数, 很简单:
#include <iostream>
#include <stdarg.h>
using namespace std;
int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);
cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, int) << endl;
va_end(ptr);
return 0;
}
int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
结果:
1
log
3
稍作改动:
#include <iostream>
#include <stdarg.h>
using namespace std;
int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);
cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, char *) << endl; // change here
va_end(ptr);
return 0;
}
int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
程序coredump, 很显然, 参数类型不对。
有兴趣的同学, 看看printf函数的源码, 也用到了变长参数, 所以, 当类型不匹配的时候, 经常会core dump, 呵呵哒。
项目实战中, 几乎所有人的人都会遇到打印log而导致的core dump问题, 最典型的就是:
string str;
printf("hehe is %s", str);
core dump, so fix it.