2015-01-13 95 views
1

根据我对C++的基本知识,我假设下面的代码会有运行时错误。由于编译器没有为y指针分配任何空间,因此应在将值指定给y指针之前添加y = new int;为指针赋值无新

我错了吗或者编译器有隐式分配空间给y指针吗? (I编译我与开发 - C++代码4.9.9.2。)

#include <cstdlib> 
#include <iostream> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    int* x; 
    int* y;    
    x = new int;   
    *x = 42;    
    cout << *x << "\n"; 
    *y = 13;    
    cout << *y << "\n"; 
} 
+3

这是未定义的行为。代码仍然是越野车。 – juanchopanza

+0

它当然没有。 –

+0

它可能是未定义的行为,只是没有显示错误。 – Codor

回答

1

4.1节规定:

一个 非功能,非阵列类型T的左值(3.10)可以是 转换为右值。如果T是 不完整类型, 需要此转换的程序是 不合格。如果向其中 左值是指该对象不是 类型T的对象,而不是源自T类型 的目的,或如果对象是 未初始化,即 必要这种转换具有 的程序未定义的行为。如果T是一个 非类类型,右值 的类型是T 的CV-不合格的版本,否则,右值的类型是 T.

未定义意味着任何事情都有可能发生 - 有是没有保证的。

从维基Making pointers safer

它没有分配给它的任何地址的指针被称为野指针。任何尝试使用这种未初始化的指针都可能导致意外行为,因为初始值不是有效地址,或者因为使用它可能会损坏程序的其他部分。结果通常是分段错误,存储违规或通配分支(如果用作函数指针或分支地址)。

1

我错了吗或者编译器有隐式分配空间给y指针吗?

它没有,并且这样的赋值是未定义行为。这意味着它可以工作,并且不会造成任何问题很长时间,但突然可能会导致应用程序崩溃。变量y实际上被分配了一些随机值,并且*y=13;将13分配给一些随机存储器地址,该随机存储器地址可以是某个结构或堆栈的有效存储器地址。如果你初始化y初始化为nullptr(或0,NULL)int* y=nullptr;,那么你应该有应用程序崩溃。