将指针赋值给没有new的指针

时间:2015-01-13 07:44:40

标签: c++ pointers memory-management heap-memory

根据我对C ++的基本了解,我假设以下代码会有运行时错误。因为编译器没有为y指针分配任何空间,所以我应该在为y = new int;指针赋值之前添加y

我错了还是编译器隐含地为y指针分配了空间? (我用Dev-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";   
}

2 个答案:

答案 0 :(得分:1)

第4.1节陈述:

  

a的左值(3.10)   非功能,非数组类型T即可   转换为右值。如果T是   不完整的类型,一个程序   需要这种转换是必要的   病态的。如果对象是哪个   左值引用不是类型的对象   T并不是一种类型的对象   派生自T,或如果对象是   未初始化,一个程序   需要进行此转换   未定义的行为。如果T是   非类型,右值的类型   是C的不合格版本的T.   否则,右值的类型是   吨。

未定义意味着任何事情都可能发生 - 无法保证。

来自Wiki Making pointers safer

  

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

答案 1 :(得分:1)

  

我错了还是编译器隐式为y指针分配空间?

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