2017-02-19 24 views
-4

考虑下面的代码:赛格故障根​​据指针分配顺序

#include <iostream> 

int main() 
{ 
    // ok by itself  
    int *ptr1; 
    int a = 3; 
    *ptr1 = a; 

    // ok by itself   
    int *ptr2 = new int(4); 
    delete ptr2; 
} 

这导致了赛格故障,我想不通为什么。如果其中任一块被评论,那没关系。如果第二块放在第一块上面,那也没关系。这里发生了什么?

+4

未定义的行为未定义。期。修复bug(不要使用变量的值,直到你为它赋值)并且神秘将消失。 –

+0

问问自己“当ptr1'被解除引用时,它指向什么”? –

回答

5

由于未初始化,您无法取消ptr1的引用。

即便如此,*ptr1 = a是不正确的,你会得到未定义的行为,这意味着此代码可能会或可能不会按预期工作。

+0

我知道我没有初始化指针,但是'* ptr1 = a'只是表示,“无论'ptr1'指向什么,现在让它指向'a'”?看起来即使我没有初始化它,它仍然指向某种东西。 – bcf

+0

@bcf,不,它并不指向任何东西,因为它是_uninitialized_。你只能取消引用指向内存的指针_你的程序拥有_,否则你会得到分段错误。 – ForceBru