打印

数组指针疑问

[复制链接]
708|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txcy|  楼主 | 2012-9-12 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近看到了数组指针,测试一段代码的时候有一些疑问
#include<iostream>#include<cstdio>
using
namespace std;

int main(void)
{
   
static
int a[2]={1,2};

   
int p=5,p2=6,*page,*page2;
   
int Test[2][3] = {{1,2,3},{4,5,6}};//测试二维数组

int Test2[3] = {1,2,3};//测试数组
    page =
&p;
    page2
=
&p2;

   
int (*A)[3],(*B)[3];//数组指针
    A =
&Test[1];
    B
=
&Test2;
    cout
<<*page<<endl;
    cout
<<(*A)[0]<<(*A)[1]<<(*A)[2]<<endl;
   
//cout<<(*A)[3]<<(*A)[4]<<(*A)[5]<<(*A)[6]<<endl;
   
//cout<<(*B)[0]<<(*B)[1]<<(*B)[2]<<endl;
    cout<<(*B)[3]<<endl;
        
//cout<<(*B)[4]<<(*B)[5]<<(*B)[6]<<endl;

return
0;
}加注释的是我后来测试的,我说说我的疑惑,题目int (*A)[3],(*B)[3];定义了两个数组指针,
然后A = &Test[1];将A指向Test数组的第二行,
输出cout<<(*A)[0]<<(*A)[1]<<(*A)[2]<<endl;这一句应该输出4 5 6也没有错,
但是为什么我后面加上cout<<(*A)[3]<<(*A)[4]<<(*A)[5]<<(*A)[6]<<endl;这一句还能够编译通过呢,
输出是1 2 3 5这是为什么呢,
同理B指向数组Test2,Test2中一共有三个元素,输出(*B)[3]不是已经越界了吗,
但cout<<(*B)[3]<<endl;这一句却输出5,
而且cout<<(*B)[4]<<(*B)[5]<<(*B)[6]<<endl;这一句的(*B)[4]输出6,
后面的两个输出(*B)[5]和(*B)[6]才显示错误(是很小的负数),不太理解

相关帖子

沙发
火箭球迷| | 2012-9-12 18:01 | 只看该作者
[] 运算发生在运行时,编译器没有办法在编译期报警,所以能通过编译.

使用特权

评论回复
板凳
baidudz| | 2012-9-12 18:10 | 只看该作者
(*A)[3]开始也已经越界了,只不过编译的时候分配内存正好是Test[2][3],Test2[3],p,p2的顺序而已
也就是说,(*A)[3]实际上读到的是Test2[0],(*A)[6]读到的是p,(*B)[3]同理,(*B)[5]后面就正好没有数据了就错误了,这种未定义的行为出现任何结果都有可能

使用特权

评论回复
地板
yybj| | 2012-9-12 18:16 | 只看该作者
第一个问题:栈上内存的分配是从高到低 Test越界过后得出的结果只是你内存中遗留下的结果,每个人的机子测出的都不一样,不可能是又回到你数组定义的地方输出原数据。
第二个问题,因为Test2数组是低地址并且与Test是连续分配的,也就是说Test2后面跟着Test,所以越界后会访问到Test的数据。至于什么时候报错我想应该是编译器说得算吧 我是无法理解。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2106

帖子

0

粉丝