当变量未分配时,为什么指针地址不同?未分配和分配的变量指针地址不相同

时间:2017-03-12 10:51:26

标签: c++ pointers memory

为什么变量未分配时指针地址不同? 为什么未分配的变量指针地址比分配的变量指针地址大很多?

输出结果为:

  

0x76d9734a   0x29fee8

#include<iostream>
using namespace std;

int main ()
{
    int * pointer;

    cout<<pointer;

    int variable = 12;

    pointer = &variable;

    cout<<endl<<pointer<<endl;

    return 0;
}

2 个答案:

答案 0 :(得分:0)

当你声明一个变量而没有初始化它时,它的值是未定义的。这意味着,首先,当你声明指针时,你的指针只包含一些碰巧在那里的随机数据。现在,您在堆栈上声明一个变量,并将指针设置为指向它。当然,这意味着指针现在保存了variable的地址,而不是在声明之后曾经存在的未定义垃圾。

关于指针值的大小:由于指针未初始化,它只包含一些不太可能指向有效内存地址的随机位。但是,当您初始化它时,它指向堆栈上的具体位置。由于堆栈存在于一个有限的内存区域,并且不是随机分布在整个地址空间中,variable的地址总是在同一个球场。

答案 1 :(得分:0)

int * pointer;

cout<<pointer;

即使您没有取消引用它,尝试从未初始化的int*读取也是未定义的行为。

这意味着C ++编程语言没有关于程序应该或不应该执行的操作的规则。您观察到的所有行为都应被视为随机行为。您可以通过初始化变量或在第一次读取之前分配变量来修复代码:

int * pointer = /* some valid value */;

或者:

int * pointer;
pointer = /* some valid value */;

请注意,nullptr是有效值。