首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问在内存中存放在“相邻”位置的数组,越界访问的一些有关问题

2012-04-20 
请教在内存中存放在“相邻”位置的数组,越界访问的一些问题首先看以下代码片段C/C++ codevoid main(){int s[

请教在内存中存放在“相邻”位置的数组,越界访问的一些问题
首先看以下代码片段

C/C++ code
void main(){int s[] = {1,2,3,4,5,6,7,8,9};int d[] = {1,2,3};/*cout<<*(d+3)<<endl<<"d+3:"<<d+3<<endl;cout<<*(d+4)<<endl<<"d+4:"<<d+4<<endl;*/cout<<"&s:"<<&s<<"\n&d:"<<&d<<endl;system("pause");return;}

输出如下
&s:0041FBB4
&d:0041FBA8

从输出结果看,数组s的地址是0041FBB4,数组d的地址是0041FBA8,0041FBB4 - 0041FBA8 = 0000000C = 12
12 / 4 = 3,刚好相差了3个int,说明了数组s和数组d在main函数的函数栈空间中是连续存放的。
这里我得出一个推断:
*(d+3)应该是访问s的第一个元素,也就是1
但是,请再看以下代码片段(其实就是把上面的注释部分去掉注释符)
C/C++ code
void main(){int s[] = {1,2,3,4,5,6,7,8,9};int d[] = {1,2,3};cout<<*(d+3)<<endl<<"d+3:"<<d+3<<endl;cout<<*(d+4)<<endl<<"d+4:"<<d+4<<endl;cout<<"&s:"<<&s<<"\n&d:"<<&d<<endl;system("pause");return;}

输出结果如下:
2686520
d+3:0028FE30
1
d+4:0028FE34
&s:0028FE34
&d:0028FE24
 
从输出结果看
输出*(d+3)竟然是个随机数(2686520),*(d+4)的值才是1,并且d+4的地址就是数组s的地址,也就是,数组s往后移动了一个字节。
实验环境,VS2008,Release模式
请教各位高手产生以上问题的原因,我想不通……


[解决办法]
数组的地址是随机分配的,两个数组的地址不是连续的,也不是一定不连续的。应该是不一定是连续的。也没有想过从一个数组去访问另一个数组的。楼主是牛人一个。
[解决办法]
标准没有规定连续.所以写程序时当它不连续.

更没有规定间隔,所以不要这么做.
[解决办法]
两个数组不一定挨着,楼上的都说了

我补充一点

默认release是速度优化的,你禁掉优化,即用/Od选项,那么就和默认debug时一样挨着了

为什么速度优化后不挨着了呢

因为编译器本来就没保证必要挨着,优化的时候有些局部变量根本就不分配,更谈不上挨不挨了

那么为什么禁掉优化后又挨着呢

因为不优化的时候,总是要老老实实分配局部变量的,挨着分配也不失为一种简单方式

热点排行