_vsnwprintf_s调用内存越界堆栈损坏

本文探讨了_vsntprintf_s函数在使用中出现内存越界的问题,并通过代码跟踪发现了问题根源在于参数理解上的误区。文章给出了正确的参数设置方式。

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

#include "stdafx.h"
#include <stdarg.h>

#define STR_MAX 1024

void FormatOutput(TCHAR * formatstring, ...)
{
	int nSize = 0;
	TCHAR *buff=new TCHAR[STR_MAX];
	//
	va_list args;
	va_start(args, formatstring);
	nSize = _vsntprintf_s( buff, STR_MAX*sizeof(TCHAR), STR_MAX-1, formatstring, args);
	_tprintf(L"nSize: %d, buff: %s\n", nSize, buff);
	va_end(args);
	//
	delete [] buff;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int x=1,y=2;
	FormatOutput(L"%d+%d=%d",x,y,x+y);
	return 0;
}

一个简单的调用,导致_vsntprintf_s出现内存越界,百思不得其解,在unicode时就是调用int _vsnwprintf_s( wchar_t *buffer, size_t sizeOfBuffer, size_t count, const wchar_t *format, va_listargptr ),这是在msdn上对_vsnwprintf_s函数的声明,第二个参数是sizeOfBuffer;

但你进行代码跟踪,跟进vswprint.c时,发现
int __cdecl _vsnwprintf_s ( wchar_t *string, size_t sizeInWords, size_t count, const wchar_t *format, va_list ap)
{
	return _vsnwprintf_s_l(string, sizeInWords, count, format, NULL, ap);
}
第二个参数变成了"sizeInWords";
事情明了了,第二个参数应该是多少个TCHAR,不是buffer的size。所以最上面的代码调用_vsntprintf_s时第二个参数用STR_MAX就可以了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值