为什么可以为未初始化的指针分配整数值

时间:2016-05-01 01:55:36

标签: c++ pointers variable-assignment

当我这样做时,它会完美打印出“2”。

int main()
{
    int *p;
    int x = 2;

    *p = x;

    cout << *p;

}

但是当我第一次将* p初始化为null时,程序崩溃了。

int main()
{
    int *p=0;
    int x = 2;

    *p = x;

     cout << *p;

}

我想问一下第一个程序首先成功运行的是什么,为什么可以将值分配给未初始化的指针?

[编辑]我的问题实际上与我过去的考试问题有关。您可以勾选多个答案,似乎(b)&amp; (c)两者都是正确的。但现在我知道(c)作品是否完全归功于运气。

enter image description here

3 个答案:

答案 0 :(得分:4)

第一个程序受到未定义的行为的影响。它似乎有效,但不幸的是,看似理智的行为也是未定义的行为。

如果程序取消引用未初始化的指针,请不要指望程序一直正常工作。

答案 1 :(得分:3)

永远不要使用未初始化的指针或取消引用空指针,你所做的是 undefined 行为,世界上任何事情都可能发生。你的代码实际上工作和行为'合理'是纯粹的运气。

至于为什么你的代码按照它的方式行事,可能是由于你的编译器和方式的原因。机器和操作系统表现。你p的变量声明只会保留未初始化的内存,其值可以是任何内容,你只是“幸运”,因为该值指的是可读写内存位置。然而,通过明确地将其设置为“0”,它指向您的操作系统可能具有的不可读的&amp;不可写入的内存位置,任何访问它的尝试都会导致CPU向您的操作系统投诉,操作系统通过终止您的程序来响应。 不要依赖这种行为它可能发生的事情,即使在相同的系统配置下也可能在未来发生。

答案 2 :(得分:1)

在你的第一个代码中,p指向一些未定义的内存。幸运的是,它是一个可写的内存区域。它似乎有用,但C ++标准,我和所有人都在这里保证你,肯定会发生坏事。

int main()
{
    int *p;  //it may even point to the first variable on the main() stack, who knows?...
    int x = 2;

    *p = x;

    cout << *p;

}

第二次失败是因为,你试图对地址int的数据进行0加载(读取)操作...现实生活中的哪个位置坦率地说,未定义。读取的偏移量可以是内存地址0+4,也可以是内存地址0-4 ....再次知道。

永远不要使用未初始化的指针!