根据我对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";
}
答案 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;
,那么你应该让应用程序崩溃。