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

lzxlzx777 2009-09-11 11:39:01
越界的数组元素,每次运行为何总是一个固定值呢?按理说,越界了,值是随机的呀?

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

const unsigned array_size=3;
int ia[array_size]={89,78,67};

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

system("pause");
return 0;
}
...全文
153 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2009-09-11
  • 打赏
  • 举报
回复
楼主试过几个编译器,就敢说是“固定”的?
pengzhixi 2009-09-11
  • 打赏
  • 举报
回复
这没什么好试的,那是因为你每次运行这段程序的时候那个越界的那个内存里面的内容没被改写罢了。
lvchun012 2009-09-11
  • 打赏
  • 举报
回复
你的堆栈空间比较小,系统分配的内存空间基本固定的,而且你的分配是静态的,一般不会产生动态的内存数据,多看看C++内存对象模型,还是对你编程蛮有帮助的
lzxlzx777 2009-09-11
  • 打赏
  • 举报
回复
大家试一下我的程序,是不是每次的随机数都一样呢?
wuyu637 2009-09-11
  • 打赏
  • 举报
回复
因为这个内存在你越界访问的时候没有被改变,如果你在越界访问的时候,中间加了大量的其他的代码,这个值的随机性就体现出来了。
theone11 2009-09-11
  • 打赏
  • 举报
回复
你程序内存的布局是固定的,除非你越界到会变动的区域,否则你代码不变,越界后访问到的数据也是不变的.
飞天御剑流 2009-09-11
  • 打赏
  • 举报
回复
不一定的。
amossavez 2009-09-11
  • 打赏
  • 举报
回复
原因是你的越界的地址并没有被覆盖 呀,你再怎么多运行几次还是那个结果的!
jean7155 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 meqxx 的回复:]
C/C++ code
#include<iostream>
#include<stdlib.h>usingnamespace std;int main()
{const unsigned array_size=3;int ia[array_size]={89,78,67};for(int i=0;i<=10;i++)
{
cout<<ia+i<<endl;//加上这一句 cout<< ia[i]<< endl;
}

system("pause");return0;
}
加上去的这句是打印内存地址。
从结果可以看出,程序数组每次运行分配的地址是相同的。
[/Quote]

我原来试过5,6次,地址都是一样的。
可能是赶巧了。
晨星 2009-09-11
  • 打赏
  • 举报
回复
C/C++语言标准中从来没说越界妨问的结果是“random”的,如果这样就可以轻易实现random,那我们还要srand/rand这些函数干吗?标准中只说越界访问的结果是“unspecified”(或者是“undefined”,具体忘了,反正肯定不是“randomized”)。
cphj 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lzxlzx777 的回复:]
问题是,我设法改变这段内容的内容,按理说,下次应该变了吧,
还是不变,这是为什么呀?

[/Quote]

那再换个说法,叫"不可控"该清楚了吧
就是你想让它变,它不一定变,你不想让它变,它却有可能变
lzxlzx777 2009-09-11
  • 打赏
  • 举报
回复
问题是,我设法改变这段内容的内容,按理说,下次应该变了吧,
还是不变,这是为什么呀?
liangchencf 2009-09-11
  • 打赏
  • 举报
回复
固定也是随机啊?随机不等于不变,随机是未知且没法预测
cphj 2009-09-11
  • 打赏
  • 举报
回复
越界下情况也是这种残留值
cphj 2009-09-11
  • 打赏
  • 举报
回复
所以我建议这种应该叫残留值,叫随机值容易误解
未初始化的变量,只是获得了一块儿内存,内存里面的值是之前曾经运行过的程序使用完该块内存之后残留下来的值
dongpy 2009-09-11
  • 打赏
  • 举报
回复
楼主对随机值的理解有偏差。

这里的随机值是指程序不可预知、不确定的意思。而不是像rand函数生成的那种随机数。
v风雪山神庙v 2009-09-11
  • 打赏
  • 举报
回复

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

const unsigned array_size=3;
int ia[array_size]={89,78,67};

for(int i=0;i<=10;i++)
{
cout<<ia+i<<endl;//加上这一句
cout << ia[i] << endl;
}

system("pause");
return 0;
}

加上去的这句是打印内存地址。
从结果可以看出,程序数组每次运行分配的地址是相同的。
SEUU 2009-09-11
  • 打赏
  • 举报
回复
还个问题还真难说呢。

高手出来抖抖吧。。。
wjlsmail 2009-09-11
  • 打赏
  • 举报
回复
行为未定义。
iBug168 2009-09-11
  • 打赏
  • 举报
回复
其实可以这样理解或者想像。。。因为内存分配的时候可能是论块的,也就是有个block,一般情况不超过这个block。。。都不会有问题。

另外,即使超过了,只要超过的内存没有被其他程序或者自己操作(以写为主),一般内容是不太会改变的。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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