问个问题printf("%f %d\n",3,3);

菜鸟在成长 2011-08-17 06:07:00
突然写了小程序,发现好像是bug一样。


void main()
{
printf("%f %d\n",3,4);
printf("%f %d\n",3,3);
printf("%f %d %d\n",3,3,3);
printf("%d %d\n",3,3);
printf("%f\n",3);
printf("%d\n",3);
}



0.000000 2147319808
0.000000 2147319808
0.000000 3 2147319808
3 3
0.000000
3

//以上出现的大整数值是随机的
貌似输出%f 的最右边的一个%d输出是不正常的。。。
...全文
237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜鸟在成长 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 demon__hunter 的回复:]
稍微纠正一下:
由于printf参数从右到左入栈
即push 4
push 3
push offset string "%f %d\n"
其中形参4 3 ..栈中是紧挨着的,而且往低地址延伸
然后printf会根据%f %d等这些描述符和实参"%f %d\n" 地址来解析栈中的数值,当遇到%f时,printf会把
4 3这两个int型实参对应栈上的8个字节里面的数据按照do……
[/Quote]

呃,这样啊,我之前因为有点忙只是在CodeBlocks下试出来的结果,还以为是个小bug呢,之后在vc6.0下面也是这样的情况。 看来应该不是bug,看了大哥您的回答原来是堆栈这方面的知识,目前还怎么接触过,不过会慢慢接触的。。
free_liyb 2011-08-17
  • 打赏
  • 举报
回复
数据类型不对
机智的呆呆 2011-08-17
  • 打赏
  • 举报
回复
4 3 啥的都是实参啊,堆了一天代码,有点迷糊了
机智的呆呆 2011-08-17
  • 打赏
  • 举报
回复
稍微纠正一下:
由于printf参数从右到左入栈
即push 4
push 3
push offset string "%f %d\n"
其中形参4 3 ..栈中是紧挨着的,而且往低地址延伸
然后printf会根据%f %d等这些描述符和实参"%f %d\n" 地址来解析栈中的数值,当遇到%f时,printf会把
4 3这两个int型实参对应栈上的8个字节里面的数据按照double类型的数据组织方式解析输出来,当遇到%d时,printf不叫思索的把保存实参4地址往上的4个字节里的数据,按照int型数据组织方式解析输出来。
所以,printf scanf这两个函数是参数类型不安全的

结合下面代码加深了解

#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>

int main()
{
int printMe=12345678;
__asm
{
mov ecx,dword ptr[printMe]
push ecx
}
printf("%f %d\n",3,4);
printf("%f %d\n",3,3);
__asm
{
pop ecx;
}
printf("%f %d %d\n",3,3,3);
printf("%d %d\n",3,3);
printf("%f\n",3);
printf("%d\n",3);
}
wangmeng1105 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 demon__hunter 的回复:]

%f把形参3,4在栈上的空间(%f假定push一个double类型的变量)全吃了,输出%d时是输出的保存形参3内存位置的往上的高地址的四个字节的里数据
[/Quote]

++
形参?
吾子墨鸿 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 demon__hunter 的回复:]
%f把形参3,4在栈上的空间(%f假定push一个double类型的变量)全吃了,输出%d时是输出的保存形参3内存位置的往上的高地址的四个字节的里数据
[/Quote]
正解+1
dfatfat 2011-08-17
  • 打赏
  • 举报
回复
类型不对 printf的除了差错
至善者善之敌 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 demon__hunter 的回复:]
%f把形参3,4在栈上的空间(%f假定push一个double类型的变量)全吃了,输出%d时是输出的保存形参3内存位置的往上的高地址的四个字节的里数据
[/Quote]

++1
wangw89 2011-08-17
  • 打赏
  • 举报
回复
要看存储空间啊,乱了!!
rxngzq 2011-08-17
  • 打赏
  • 举报
回复
类型都不对啊!!
机智的呆呆 2011-08-17
  • 打赏
  • 举报
回复
%f把形参3,4在栈上的空间(%f假定push一个double类型的变量)全吃了,输出%d时是输出的保存形参3内存位置的往上的高地址的四个字节的里数据
rendao0563 2011-08-17
  • 打赏
  • 举报
回复
%f 是double吧. 类型都不对 错误是必然的.

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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