指针数组问题

Pointer array question

本文关键字:问题 数组 指针      更新时间:2023-10-16
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

谁能告诉我为什么?我真的很困惑。

在第一种情况下,为什么它不是越界错误,而是一个未定义的错误?为什么第二种情况不会出现错误?我曾经认为它们是一样的……

实际上我知道数组从0开始,我很困惑为什么第一个得到了一个错误,但第二个不会????

您正在调用未定义的行为。在这两种情况下,你的索引都超出了数组的边界;相应的行为未定义。它可能会崩溃,或者它可能会输出无意义的内容,或者它可能会做其他事情。

未定义行为对于新手来说似乎是一个非常棘手的概念。但这很简单,如果你违反了c++的规则(就像你的例子中所做的那样),那么,你的程序的行为通常是不确定的。它的意思就是它所说的,问"为什么它这样做"是毫无意义的,因为不再有任何规则或法律适用于你的情况。

C/c++中的数组下标从0开始。因此,大小为3的数组具有有效的索引0、1和2。

现在,在程序堆栈上有变量test。因此,数组边界之外的内存仍然是你的(这就是为什么当你读取数组的索引3时,你不会得到分段错误(访问冲突)错误)。然而,您正在读取堆栈的一部分,这是您之前的函数调用中的乱码,驻留在内存上的乱码或函数中的其他变量。这就是为什么你会得到奇怪的数字。

你应该注意不要超出数组边界。在一个复杂的程序中,这真的很难调试,因为你遍历堆栈更改其他变量,而在调试时你所看到的只是变量的随机行为,你甚至没有碰过!!