'sprintf'方法是否有默认的缓冲区长度?

时间:2010-03-31 08:48:05

标签: visual-c++ printf buffer-overflow access-violation

我使用sprintf方法将数据格式化为我想写入文件的字符串,在使用VS 2008的C ++控制台应用程序中.Input是一个特殊的消息,它有各种变量和值(例如:Type'int'和值'10'/键入字符串和值“abc”等。)当我发送两条消息时,它完美地工作。但是,当我发送两条以上的消息时,它会发出运行时错误,指出 0xC0000005:访问冲突读取位置0xabababab 。为什么会这样?是因为'sprintf'方法有一个默认的缓冲区长度吗?我怎样才能克服这个问题?

2 个答案:

答案 0 :(得分:1)

不,没有默认尺寸。它将假设有足够的空间,并且写入格式化字符串指定的数量。

您的访问权限违规说明了正在阅读,这暗示您的参数可能存在问题,可能与格式化字符串不匹配。

您需要使用% - 格式化字符串中的代码引用正确的类型和正确顺序的参数。

答案 1 :(得分:1)

顺便说一句,你可能想看看this page

  

0xABABABAB:由Microsoft的HeapAlloc()用于在分配的堆内存后标记“无人登陆”保护字节