C++ 可变参数处理过程中遇到的疑难杂症

在处理可变参数函数voidFuncTest时,遇到一个问题:当传入的pStrMsg为价格%s总价%s,并用va_list和vsprintf处理时,第二个可变参数值未正确获取。原因是GetPrice()在同一函数中被调用两次,导致栈指针相同。解决方案是创建新的GetPriceEx()函数,确保每个可变参数有独立的栈地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在处理可变参数函数赋值过程中发现了一个比较头疼的问题,

void FuncTest(  LONG lMBId, int nMBType, char* pStrMsg, ...)

注意 char * pStrMsg 最后一个参数是可变参数, 可变参数要求必须在是最后一个参数 这都么马达。

但是下面的处理过程, 却没有达到预期的效果

pStrMsg 输入的是 价格 %s 总价 %s , 然后参数通过可变参数传递了两个 字符串, 而且这两个字符串是同一个函数

地址栈返回的

	va_list argList;
	va_start(argList, pStrMsg);
	vsprintf(msg, pStrMsg, argList);
	va_end(argList);

上面的处理过程没问题 , 将可变参数的值拷贝到格式化字符串中,理想状态应该输出 价格 10000 总价 5000

但是 最后输出的字符串 成 价格 10000 总价 10000 , 也就是说 第二个可变参数的值没有取出来。

检查了N遍代码, 始终找不到问题在哪里,调用堆栈 单步调试也跑了,最后发现 vsprintf(msg, pStrMsg, argList);

这里获取可变参数的时候,栈指针指向的是同一个地址,自然返回值肯定是一样的,问题就在这里。

调用的时候 FuncTest( LONG lMBId, int nMBType, char* pStrMsg, GetPrice(a),GetPrice(b))

这里的GetPrice() 在同一个可变参数的函数中调用了两次 ,自然取到的栈地址一样,导致值相同。

解决方案:重新扩展 GetPriceEx (b)然后通过以下方式调用

调用的时候 FuncTest( LONG lMBId, int nMBType, char* pStrMsg, GetPrice(a),GetPriceEx(b))

传递不同的栈指针, 就可以取到可变参数的准确值。 希望大佬们别在这里耽误了时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值