如果引用必须指向有效内存,那么为什么这个程序编译成功
if references must refer to valid memory,then why this program is compiling successfully?
我昨天上了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)。
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 为什么C++程序在太大时返回代码而不是答案?
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 为什么 C++ 程序员更喜欢前缀 ++,而 Java 程序员更喜欢后缀 ++?
- 为什么程序会错过"if"运算符?
- 为什么程序运行时我的第二个循环不执行?
- 为什么程序没有正确计算值
- 为什么程序显示我"was not declared in this scope"?
- 如果我对"while"块发表评论,为什么程序会死机?其中的"yield"线有何影响?
- C++ 为什么程序只读取第一个值
- 为什么程序在 cin 之后跳过 cin.get()?
- 为什么程序显示的值大于结果或垃圾值
- 前和后条件用法。为什么程序不响应条件
- 为什么程序显示字符串超出范围
- 为什么程序不起作用
- 为什么程序在一台计算机上而不是在另一台计算机上留下循环
- 为什么程序没有以正确的方式执行
- 为什么程序打印在调试和发布中浮动不同
- 动态内存分配 - 为什么程序结束时没有"delete"?
- 为什么程序在结束后失败