看变长参数, 很简单:

 

#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.

 

 


本文转载:CSDN博客