| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1459 人关注过本帖
标题:再来一个问题
只看楼主 加入收藏
独孤小梦
Rank: 1
等 级:新手上路
威 望:1
帖 子:338
专家分:0
注 册:2008-6-5
收藏
得分:0 
#include <stdio.h>
int main()
{
    int a=0xffffffff;
    int b=0xffffffff;
    char c[3];
    printf("a=%x, b=%x\n", a, b);
    scanf("%s",c);
    fflush(stdin);
    printf("%s\n",c);
    printf("a=%x, b=%x\n", a, b);
    return 0;
}

编程小菜
2008-07-15 17:46
hello_moto
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-7-15
收藏
得分:0 
似乎没明白啊,呵呵,我来解释吧,9#已经基本上解释了。
我是想让大家看看溢出的后果。

#include <stdio.h>
int main()
{
    int a=0xffffffff;
    int b=0xffffffff;
    char c[3];
    printf("a=%x, b=%x\n", a, b);
    scanf("%s",c);
    printf("%s\n",c);
    printf("a=%x, b=%x\n", a, b);//注意两次是否一致
    return 0;
}

1. char[3]可以接受2个字符,因为是以字符串方式输入的,末位会加\0,也要占一位,所以一旦输入3个字符就是越界。
2. 但是,呵呵,你输入3个字符这个程序还是可以接受的,没有任何影响。因为CPU为了字对齐,数组c后的一个字节是不用的,从下个4的整数倍地址开始存放int b。所以c实际上可以用4个字节,当然这在程序上是属于越界操作,但没有产生不良影响。
3. 如果你输入了4个字符呢?这是连同\0是5个字符,不仅用完了数组c的空间,连空闲的那一个字节也用完了,怎么办?不管,照做,但这时存放c中字符的空间已经和int b的空间冲突了,也就是要改写b的值。你可以看到两次输出b的值是不同的了,这就是溢出的后果。如果输入4个字符,那么b被改写的部分就是最后的一个字节,改为\0,即0,可以自己试一下。
4. 以此类推,随着输入字符的增多,b的空间,a的空间将被逐渐侵占,看到的像就是两次输出a,b差别越来越大,直到a的空间也被用完,这时你输入了多少字符?12个
5. 没有空间之后,如果还有字符,程序还是会接着做,不过这时存放的地方就不是可以自由修改的了,那里一般存放的是函数的调用入口地址,调用指针,返回值等等,如果被改写,那么程序就立刻崩溃了。
2008-07-15 19:53
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
受教了。
2008-07-16 09:41
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
收藏
得分:0 
呵呵,经典,我不懂怎么搞这样例子。
2008-07-16 16:18
快速回复:再来一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015271 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved