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

时间:2015-07-07 03:46:30

标签: c++ arrays pointers pass-by-reference

我上一天参加了我的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;
}

4 个答案:

答案 0 :(得分:1)

引用必须在绑定时引用有效内存。然而,惩罚&#34;违反此规则的是undefined behaviour。编译器不必检测或通知您已破坏规则。

答案 1 :(得分:0)

这实际上并不是一个参考。数组是一个有趣的指针。

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

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

我不会错过指针算术。

答案 2 :(得分:0)

访问array_demo[11]会导致未定义的行为;什么都可能发生。在那些属于&#34;任何东西&#34;表现得没有任何错误。

答案 3 :(得分:0)

看一些评论,这有点归结为不同的人试图在“有效”这个词中加入多少含义。

指针有一种无指向的方式:NULL。所以你可以说一个NULL指针指向一个“无效”的对象或变量。

但是引用无法引用任何内容。因此,除非您不遗余力地违反其他语言规则,即“有效”对象或变量。因此,在简单的对话中,很容易说“引用始终指向有效对象”,并且意味着与指针和NULL相比。

但是如果你确实违反了规则,那么你可以获得悬空引用或对内存的引用,这些引用通常不会发生。它可能仍然是“有效内存”,因为它存在于进程的地址空间内,但也不是任何“有效”对象或变量。

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

如果你对这个词感到困惑,那就采用这种改写的方式:引用总是指某事

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