免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: ggyy66
打印 上一主题 下一主题

越界的数组元素,每次运行为何总是一个固定值呢?按理说,越界了,值是随机的呀? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-09-12 15:05 |只看该作者
可能和你的程序有关系
比如,你在程序中定义如下:
char a[5]={'h','e','l','l','o'};
char b='3';

那么变量在内存中分布形如:

1     2     3     4      5     6     7       8       9
H     E     L     L      O     3     

这时候,如果你越界访问,如a[5],它就会访问到第6个字符'3',这个字符绝大多数情况下是你在程序中定义的变量,那你说,是不是随便你怎么启动机器,每次读出的都是同一个字符?

说到底,这其实和编译器,以及你定义的变量类型,长度有关。

论坛徽章:
0
12 [报告]
发表于 2009-09-12 22:40 |只看该作者
LZ 你想当然了。事实上,根本没有规定说一定要随机——或者按你的讲法,一定要“有变化”。
如果你用 VC debug build 一下,你还会看到栈上所有未初始化数据全部是烫烫烫烫 XD

论坛徽章:
0
13 [报告]
发表于 2009-09-13 11:16 |只看该作者

回复 #1 ggyy66 的帖子

楼主每次都把数组的地址打印一遍不可能变的啊,再说这和越界没关系吧
cout << ia << endl;

论坛徽章:
0
14 [报告]
发表于 2009-09-13 11:23 |只看该作者
如果代码是这样:

        for(int i=1;i<=10;i++)
        {
                cout << ia << endl;
        }

只是打印ia的值,那么每次程序运行的ia的值都一样,是正常的,
因为这个只取决于栈顶位置,这个一般是固定的,除非打过随机栈顶的patch。

楼主的意思是不是这样的代码啊:

        for(int i=1;i<=10;i++)
        {
                cout << ia【i】 << endl;
        }
(晕倒,误会楼主了,原来这个中括号是会自动消失的)


这样的确是随机的啊:


-bash-3.2$ ./t3
78
67
3
4
1491076000
1491076088
1320941269
134514544
134514112
1491076088
sh: pause: command not found
-bash-3.2$ ./t3
78
67
3
4
1604291008
1604291096
1366357717
134514544
134514112
1604291096
sh: pause: command not found
-bash-3.2$ ./t3
78
67
3
4
1576557440
1576557528
1323284181
134514544
134514112
1576557528
sh: pause: command not found
-bash-3.2$

测试环境,fedora 10, gcc 4.3.2

[ 本帖最后由 drangon 于 2009-9-13 11:26 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2009-09-14 11:14 |只看该作者
原帖由 ggyy66 于 2009-9-11 11:39 发表
越界的数组元素,每次运行为何总是一个固定值呢?按理说,越界了,值是随机的呀?
#include
#include
using namespace std;
int main()
{

        const unsigned array_size=3;
        int ia[array_size]={89,7 ...



没看到越界,只看到你输出了 ia 这个数组的首地址……
看看这个吧~~~

#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const unsigned array_size=3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ia[array_size]={89,78,67};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *ib = ia;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=1;i<=10;i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << ia << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << *ib << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ib++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << *ib << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}        
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP