_snprintf_s 的正确使用方式

​这次遇到的奔溃问题,和从一次奔溃谈谈strncpy_s中有异曲同工之处:程序在执行到某个点后,瞬间干干净净的退出,也没有dmp文件生成。根据环境确定了怀疑点后,在TerminateProcess函数上加断点,然后运行程序,程序在TerminateProcess上中断下来,堆栈如下(简化模型):

 

问题出在_snprintf_s上,奔溃原因是_invalid_parameter_noinfo函数中调用了TerminateProcess函数,看意思是参数有问题。

 

_snprintf_s的有两种重载方式(stdio.h中),第一种如下:

__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_2_ARGLIST(      _Success_(return >= 0)      int, _snprintf_s, _vsnprintf_s,      _Post_z_                        char,        _Buffer,      _In_                            size_t,      _BufferCount,      _In_z_ _Printf_format_string_ char const*, _Format      )

 

第二种是:

_Success_(return >= 0)_Check_return_opt__CRT_STDIO_INLINE int __CRTDECL   _snprintf_s(      _Out_writes_z_(_BufferCount)    char*       const _Buffer,      _In_                            size_t      const _BufferCount,      _In_                            size_t      const _MaxCount,      _In_z_ _Printf_format_string_ char const* const _Format,      ...)

 

第一种是只有一个长度参数_BufferCount,第二种有两个长度参数:_BufferCount和_MaxCount。

 

乍一看之下,第一种和第二种之间没啥区别,只在于差一个长度参数。

 

等等,第一种好像有点怪。这里先卖个关子(如果眼力尖,可能已经看出来了),后续揭晓。

 

MSDN对_snprintf_s参数的解释如下:

1. _BufferCount:_Buffer的大小

2. _MaxCount:可存储的最大字符数

 

MSDN对返回值的说明如下:

1. _snprintf_s returns the number of characters stored in buffer, not counting the terminating null

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值