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

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

本文关键字:为什么 程序 成功 编译 引用 内存 有效 如果      更新时间:2023-10-16

我昨天上了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]也可表示为*(array_demo+11)

见:http://www.cplusplus.com/doc/tutorial/pointers/数组

我不想念指针运算

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

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

但是引用不可能指向任何东西。所以除非你特意违反了语言的其他规则,否则它就是一个"有效的"对象或变量。因此,在简单的对话中,很容易说"引用总是指向有效对象",这意味着与指针和NULL相比。

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

那么一个不好的引用是有效的还是无效的?这取决于你到底想说什么……

如果你对这个词不感兴趣,那就用这种方式改写:引用总是指某事

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