int test[3] = {1,2,3};
cout<<test[3]<<endl;
// this will get a error
但是
int test[3] = {1,2,3};
int (*A)[3];
A = &test;
cout<<test[3]<<(*A)[3]<<endl;
// this will print -858993460 withiout any errors
所以有人能告诉我为什么吗?我真的很困惑。
在第一种情况下为什么它不是outboundbound错误但是一个未定义的错误? 为什么第二种情况不会出错?我曾经认为他们是一样的......
实际上我确实知道数组从0开始,我很困惑为什么第一个出错但第二个不会????
答案 0 :(得分:10)
您正在调用未定义的行为。在这两种情况下,您的索引都超出了数组的范围;相应的行为未定义。它可能会崩溃,或者可能会输出废话,或者它可能会做其他事情。
答案 1 :(得分:3)
对于新手来说,未定义的行为似乎是一个非常棘手的概念。但是这很简单,如果你打破了C ++的规则(因为两者你的例子那么做),那么很多时候,程序的行为是不确定的。它完全意味着它所说的内容,并且毫无意义地询问“为什么会这样做”,因为不再适用于您的情况的任何规则或法律。
答案 2 :(得分:2)
C / C ++中的数组索引从0开始。因此,大小为3的数组具有有效索引0,1和2.
现在,您在程序堆栈上拥有变量test
。因此,数组范围之外的内存仍然是您的(这就是为什么在读取数组的索引3时不会出现分段错误(访问冲突)错误)。但是,您正在读取堆栈的一部分,这些堆栈是您之前的函数调用中的乱码,驻留在内存中的乱码或函数中的其他变量。这就是为什么你会得到奇怪的数字。
你应该注意走出数组边界。在一个复杂的程序中,这很难调试,因为你越过堆栈更改其他变量,所有你看到的调试是你甚至没有触摸的变量中的随机行为!!