LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 736|回复: 4

菜鸟问题求助!

[复制链接]
发表于 2007-2-26 14:37:21 | 显示全部楼层 |阅读模式
以下代码

#include <iostream>
void main()
{
    char *p = "12345678";
    char a[1];
    memset(a, 0, 1);
    strcpy(a, p);
    printf("%s\n", a);
}
我是在windows下用的VC6.0
如上代码,我不理解的是对char a[1]已经作了大小限制,可是为什么对其进行strcpy()操作时没有出错?编译和执行都通过了,输出为:12345678。
上述代码中如果char *p = "123456789"时编译通过,执行时倒掉。
菜鸟问题,还希望各位大侠能给与帮助。
发表于 2007-2-26 16:07:43 | 显示全部楼层
Post by swink
以下代码

#include <iostream>
void main()
{
    char *p = "12345678";
    char a[1];
    memset(a, 0, 1);
    strcpy(a, p);
    printf("%s\n", a);
}
我是在windows下用的VC6.0
如上代码,我不理解的是对char a[1]已经作了大小限制,可是为什么对其进行strcpy()操作时没有出错?编译和执行都通过了,输出为:12345678。
上述代码中如果char *p = "123456789"时编译通过,执行时倒掉。
菜鸟问题,还希望各位大侠能给与帮助。

显示没有错很正常,要看执行的时候堆栈的具体情况,显示出来的结果没有错并不表示运行过程没有出错。具体情况你可以把你的可执行文件反汇编一遍瞧瞧汇编代码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-26 16:37:38 | 显示全部楼层
还是不太明白,没有接触过汇编,刚才反编译了下.exe文件,结果汇编的代码看不懂
能不能详细点说明呢?
麻烦了!~
回复 支持 反对

使用道具 举报

发表于 2007-2-26 17:19:27 | 显示全部楼层
Post by swink
还是不太明白,没有接触过汇编,刚才反编译了下.exe文件,结果汇编的代码看不懂
能不能详细点说明呢?
麻烦了!~

你可以在char a[1];前后各加上char xxx[32];和char yyy[32];,然后在程序尾再将xxx和yyy打印出来就也许可以看到影响,但是注意这里xxx和yyy用循环一个字符一个字符的打,并且最好将它们先初始化,比如用'x'字符填满两个数组。其实你的程序,a数组还是还是溢出了,就好像小缸装不了太多水,装多了就往别的地方冒一样。相当于strcpy所拷贝的p的内容跑到a数组周围的内存(堆栈)里去了,但是如果溢出的内容不够多,比如没有覆盖main的返回地址,那么错误在表面上是看不出来的。打个比方就是这口缸10米远的地方有条棉被,那么溢出的水不够多,才流到5米远的地方,那么棉被自然是不会湿掉。但是,缸里的水是已经溢出来了。如果多加点水,自然就会流到棉被那。不过如果在缸的周围堆点土,那么再多加水也不一定会流到棉被那里(只是土湿掉而已),这个有点相当于所加的xxx和yyy变量一样。道理反正是这样,感觉自己太罗嗦了,不知道你看懂没有。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-27 08:22:37 | 显示全部楼层
明白了,谢谢你!~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表