C ++无法理解未分配指针的行为

时间:2018-03-25 08:56:06

标签: c++ pointers

我是C ++的新手。我正在通过tutorialspoint课程。 在使用内置编译器(GNU GCC v7.1.1)来学习指针时,我发现了一个相当不寻常的行为(在下面的观察部分中说明),我无法理解。

我尝试了以下方案,尝试进行一些具体的推断 -

情景1

代码 -

int main () {
   int  *ptr;
   cout << "The value of ptr is " << ptr;
   return 0;
}   

输出 -

ptr的值为0

场景2

代码 -

int main () {
   int a =20;
   int  *ptr;
   cout << "The value of ptr is " << ptr;
   return 0;
}   

输出 -

ptr的值是0x7ffff0278150

场景3

代码 -

int main () {
   int a =20;
   int  *ptr;
   cout<<"The address of a is "<<&a<<"\n";
   cout << "The value of ptr is " << ptr;
   return 0;
}

输出 -

a的地址是0x7ffcee0e2e74

ptr的值为0

观察

场景1:默认情况下,指针指向NULL或OS已从分配给ptr的内存位置清除现有数据。无论如何,我发现这个输出无法解释。

场景2:这是一个奇怪的场景。只是为某个新变量赋值会导致我的指针存储一些垃圾内存地址。请注意,我没有明确指定指针指向该变量或任何其他变量。

场景3:独立地,这种情况最容易理解。但是当与第2次一起考虑时,它更加复杂。

任何人都可以解释或假设这里可能发生的事情吗?

2 个答案:

答案 0 :(得分:2)

您的所有观察都无效。您无法从未初始化且未分配有效值的int*中读取。如果你这样做,你通过尝试打印指针值在所有场景中都这样做,那么程序的行为(而不仅仅是输出)是由C ++语言规范定义的。

答案 1 :(得分:1)

你&#34;无法理解未分配指针的行为&#34;因为它的行为不是由C ++定义的。

这就是为什么如果你不想在声明时初始化它,你应该总是设置一个指向NULL或nullptr的新指针。