为什么变量未分配时指针地址不同? 为什么未分配的变量指针地址比分配的变量指针地址大很多?
输出结果为:
0x76d9734a 0x29fee8
#include<iostream>
using namespace std;
int main ()
{
int * pointer;
cout<<pointer;
int variable = 12;
pointer = &variable;
cout<<endl<<pointer<<endl;
return 0;
}
答案 0 :(得分:0)
当你声明一个变量而没有初始化它时,它的值是未定义的。这意味着,首先,当你声明指针时,你的指针只包含一些碰巧在那里的随机数据。现在,您在堆栈上声明一个变量,并将指针设置为指向它。当然,这意味着指针现在保存了variable
的地址,而不是在声明之后曾经存在的未定义垃圾。
关于指针值的大小:由于指针未初始化,它只包含一些不太可能指向有效内存地址的随机位。但是,当您初始化它时,它指向堆栈上的具体位置。由于堆栈存在于一个有限的内存区域,并且不是随机分布在整个地址空间中,variable
的地址总是在同一个球场。
答案 1 :(得分:0)
int * pointer; cout<<pointer;
即使您没有取消引用它,尝试从未初始化的int*
读取也是未定义的行为。
这意味着C ++编程语言没有关于程序应该或不应该执行的操作的规则。您观察到的所有行为都应被视为随机行为。您可以通过初始化变量或在第一次读取之前分配变量来修复代码:
int * pointer = /* some valid value */;
或者:
int * pointer;
pointer = /* some valid value */;
请注意,nullptr
是有效值。