变长参数的三点..., 打印log为什么容易core dump?

972 篇文章 329 订阅
309 篇文章 11 订阅

      看变长参数, 很简单:

 

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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值