菜鸟简单问题(回帖有分,问题弄明白就结贴)

GARY 2010-11-12 09:51:23


==================================================
执行:
sprintf(s, "%.2f", i);
就会出现这个异常,如果我修改为:
sprintf(s, "%.2f", (double)i);
就没问题了。请问各位大侠,这个是什么原因。
==================================================
我自己也想了一下,参数压栈时是压入了一个int型整数,
但sprintf函数执行时,并不知道被压入栈里的参数是个
int型整数。于是i被当做float来处理,可能是这出问题了吗?
谢谢大家。
...全文
185 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
顶一下~~~~~~~~~
shangyangi 2010-11-12
  • 打赏
  • 举报
回复
学习,学习……
GARY 2010-11-12
  • 打赏
  • 举报
回复
楼上们别无视我的回帖啊。
====================================
特别感谢1楼,不过还是有些疑问
int是4个字节,%.2f float不也是4个字节吗?
不过为什么是从栈里面取8个字节呢?
====================================
Smile_Tiger 2010-11-12
  • 打赏
  • 举报
回复
c++的处理栈参数的format方式,是有灵活参数个数、参数类型的优点,但是是不安全的,而且无法避免

GARY 2010-11-12
  • 打赏
  • 举报
回复
楼上们别无视我的回帖啊。
====================================
特别感谢1楼,不过还是有些疑问
int是4个字节,%.2f float不也是4个字节吗?
不过为什么是从栈里面取8个字节呢?
====================================
wuyan1989 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 superarhow 的回复:]

压入double型是8个字节
004116FA sub esp,8
004116FD fstp qword ptr [esp]
压入int型就只有4个字节.
004116F7 mov eax,dword ptr [i]
004116FA push eax
sprintf在遇到%.2f时尝试从栈里面取8个字节……
[/Quote]

解释的很好
GARY 2010-11-12
  • 打赏
  • 举报
回复
我是真的糊涂啊。
====================================
特别感谢1楼,不过还是有些疑问
int是4个字节,%.2f float不也是4个字节吗?
不过为什么是从栈里面取8个字节呢?
====================================
这就是问题啊。
booksoon 2010-11-12
  • 打赏
  • 举报
回复
自问自答~~~揣着明白当糊涂~~
qq120848369 2010-11-12
  • 打赏
  • 举报
回复
LZ,你有意思?
GARY 2010-11-12
  • 打赏
  • 举报
回复
忘记说了我的编译器是vc8,运行时异常
换用vc9也是一样的情况
gcc可以通过,但什么也没打印出来
谢谢以上几楼的朋友。
特别感谢1楼,不过还是有些疑问
int是4个字节,%.2f float不也是4个字节吗?
不过为什么是从栈里面取8个字节呢?
xjpzy 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 superarhow 的回复:]
压入double型是8个字节
004116FA sub esp,8
004116FD fstp qword ptr [esp]
压入int型就只有4个字节.
004116F7 mov eax,dword ptr [i]
004116FA push eax
sprintf在遇到%.2f时尝试从栈里面取8个字节,而如果这时你只push了4个就可能出AV
[/Quote]
1楼正解
robertbo 2010-11-12
  • 打赏
  • 举报
回复
字节数不一样,int类型的对应的是%d
luciferisnotsatan 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 superarhow 的回复:]

压入double型是8个字节
004116FA sub esp,8
004116FD fstp qword ptr [esp]
压入int型就只有4个字节.
004116F7 mov eax,dword ptr [i]
004116FA push eax
sprintf在遇到%.2f时尝试从栈里面取8个字节……
[/Quote]
+1
我是小数位 2010-11-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hslinux 的回复:]
VS2008下编译并运行通过,但是s的值为0.0,sprintf(s, "%0.2f", (float)i);值就正常了。
[/Quote]%/2f輸出格式是浮點,你的I是整型的,所以要做個強制類型轉換!
me115 2010-11-12
  • 打赏
  • 举报
回复
学习
[Quote=引用 1 楼 superarhow 的回复:]

压入double型是8个字节
004116FA sub esp,8
004116FD fstp qword ptr [esp]
压入int型就只有4个字节.
004116F7 mov eax,dword ptr [i]
004116FA push eax
sprintf在遇到%.2f时尝试从栈里面取8个字节……
[/Quote]
hslinux 2010-11-12
  • 打赏
  • 举报
回复
VS2008下编译并运行通过,但是s的值为0.0,sprintf(s, "%0.2f", (float)i);值就正常了。
半斗 2010-11-12
  • 打赏
  • 举报
回复
i被当double处理了
superarhow 2010-11-12
  • 打赏
  • 举报
回复
压入double型是8个字节
004116FA sub esp,8
004116FD fstp qword ptr [esp]
压入int型就只有4个字节.
004116F7 mov eax,dword ptr [i]
004116FA push eax
sprintf在遇到%.2f时尝试从栈里面取8个字节,而如果这时你只push了4个就可能出AV

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧