如果引用必须引用有效内存,那么为什么这个程序编译成功?

if references must refer to valid memory,then why this program is compiling successfully?

我最后一天参加了 class 的 C++ 课程,老师告诉我引用必须引用有效内存,而指针可能会也可能不会。我正在玩参考,突然想到这个问题。当我声明一个大小为 10 的 array_demo 并将它的值分配给 10 到 19 时,为什么程序正在编译,如果我指的是外面的东西,我会得到一个垃圾编号不是有效内存的数组(索引 11)!

#include <iostream>

using namespace std;


int main()
{
    int array_demo[10];
    int x= 10;
    for(int i=0; i<10; i++)
    {
        array_demo[i]= x; //assigning values to array_demo
        x++;
    }
    for(int j=0; j<10; j++)
    {
        cout<<array_demo[j]<<endl; //printing array values
    }
    cout<<endl;
    cout<<endl;


    int *p_x=array_demo;
    int &ref_x= array_demo[11];

    cout<< *(p_x+11)<< endl;
    cout << ref_x << endl;
}

这实际上不是参考。数组是一个看起来很有趣的指针。

array_demo[11] 也可以表示为 *(array_demo+11)

参见:http://www.cplusplus.com/doc/tutorial/pointers/#arrays

我不会错过指针运算。

引用在绑定时必须引用有效的内存。然而打破这个规则的"punishment"是undefined behaviour。编译器不必检测或通知您您违反了规则。

访问array_demo[11]导致未定义的行为;任何事情都可能发生。在那些属于 "anything" 类别的行为中,表现得好像什么都没有错。

看看一些评论,这有点归结为不同的人试图给这个词赋予多少意义 "valid"。

指针有办法不指向任何东西:NULL。所以你可以说 NULL 指针指向一个 "invalid" 对象或变量。

但引用无法引用任何内容。因此,除非您不顾一切地违反将成为 "valid" 对象或变量的语言的其他规则。所以在简单的对话中很容易说 "a reference always points to a valid object" 并且与指针和 NULL 相比的意思是

但如果您确实违反了规则,那么您可能会得到通常不应该发生的悬空引用或内存引用。它可能仍然是 "valid memory",因为它存在于进程的地址 space 中,但也不是任何 "valid" 对象或变量。

那么错误的引用是有效还是无效?这取决于你到底想说什么...

如果您对这个词感到迷惑,请采用这种改写方式:引用总是指 某物

还要记住,C++ 并没有很大的障碍来阻止你违反它的规则。您可以通过未定义的行为(例如超出数组边界的访问)创建奇怪且看似不一致的情况。语言不会而且在很多情况下不能阻止你做这样的事情。作为开发人员,您必须确保您的逻辑是正确的 and/or 使用建立在基本语言之上的机制来捕获无效情况(例如,vector::at)。