scanf函数覆盖问题

hfy19 2010-08-05 09:28:59
#include<stdio.h>

int main()
{
int i;char c;
for(i=0;i<5;i++)
{
scanf("%d",&c);
printf("%c ",c);
printf("%d ",i);
}
return 0;
}
linux下 gcc编译运行 输入整数
则改整数会覆盖i的值,
i输出一直为0并形成死循环。
程序源码在《c缺陷与陷阱》p76 解释如下 :字符c存放的是整数的低端部分,每次读入一个数值到c时,都会将i的低端部分覆盖为0。
对解释没理解,知道的大哥给讲下。小弟分数不多,只有在此多谢。
...全文
429 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-08-07
  • 打赏
  • 举报
回复
debug跟踪的时候到了。
hfy19 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ryuji1986 的回复:]
scanf("%d",&c)
第一个参数是格式化的字符串,scanf函数就靠解析字符串来工作;
第二个参数 &c 是取C的地址,也就是一个指针,因为不确定数据类型,在scanf内部必定把所有的指针当作void *,然后根据格式化字符串的内容将他转换成 char* 或者其他的*;

i c 两个变量在栈中的位置肯定相邻,C占一个字节, i占4个
scanf("%d",&am……
[/Quote]

如你所言,但是有个地方---就是放值问题,c的地址和i的好像是连在一起的。
如果输入32768 ,则 i是127;输入65535,结果是255。
分析占位,应该是放一起。
在此多谢。
多喝水ooo 2010-08-06
  • 打赏
  • 举报
回复
栈从高地址向低地址分配,cl在i前一个字节,当按照整形读入c时,会修改&c到&c 3内存对应的值,也就是修改了i的低三位。我是这样理解的
saiyue123 2010-08-06
  • 打赏
  • 举报
回复
数学试题哪里有啊
jldream110 2010-08-06
  • 打赏
  • 举报
回复
书上说的挺明白的啊 scanf("%d",&c) 你输入的时候 是想用把他当字符变量大小存储 可是前面用了 %d 给了你整型变量的位置(一般为char的4倍)放c,然后这样 正好覆盖了 原本放i的低位 ,因为你的i是很小的数 所以本来高位就是0 于是 前面会多输出几个0
wing_0706 2010-08-06
  • 打赏
  • 举报
回复
因为 整型数 是 4个字节的。。 char 一个字节 内存 里 char只读到 一个字节。。
龙二伤 2010-08-06
  • 打赏
  • 举报
回复
scanf("%d",&c)
第一个参数是格式化的字符串,scanf函数就靠解析字符串来工作;
第二个参数 &c 是取C的地址,也就是一个指针,因为不确定数据类型,在scanf内部必定把所有的指针当作void *,然后根据格式化字符串的内容将他转换成 char* 或者其他的*;

i c 两个变量在栈中的位置肯定相邻,C占一个字节, i占4个
scanf("%d",&c) 执行后, 向C的地址,那个只有一个字节的内存单元去写4个字节的内容,当然会把其他的3个字节写到 i 里面去

gcc 编译器下, 比如 c 地址为 0x0, i 的地址为0x2 , 为了寻址方便, 肯定不会把i放到奇数地址去,然后
向0x0地址写4个字节,会覆盖 0x2 0x3 2个地址的内容, 于是 i 的低位或者高位就被覆盖了
swl82560397pq 2010-08-05
  • 打赏
  • 举报
回复
我单步在vc下跟了下,发现c的地址在
i的前面一个字节。
swl82560397pq 2010-08-05
  • 打赏
  • 举报
回复
LZ不必纠结这种问题吧,搞点有意义的研究
一般谁会这么写呢?
hfy19 2010-08-05
  • 打赏
  • 举报
回复
这个程序没错 请看清楚我的问题
输入整数 会形成死循环 因为将整数存入了字符型
输入字符则不会出问题
aaajj 2010-08-05
  • 打赏
  • 举报
回复
scanf("%d",&c);

scanf("%c",&c); 吧
swl82560397pq 2010-08-05
  • 打赏
  • 举报
回复
出错在这句 scanf("%d",&c);

70,018

社区成员

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

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