2012-08-08 58 views

回答

5

那么,为什么这个代码工作正常

未定义行为意味着代码可以出现很好地工作。但它仍然没有定义。

在你的情况下,a是一个悬挂指针。

+0

所以我应该避免这样做? – user1393669 2012-08-08 18:07:41

+1

@ user1393669不仅可以避免。你应该明确不这样做。 – 2012-08-08 18:08:11

+0

@ user1393669未定义的行为是编译器/机器特定的。它可能在您的机器上正常工作,但可能会崩溃在其他人的机器上。 – gcochard 2012-08-08 18:08:34

0

该代码仍然是错误的。它可能出现现在工作,但不会在下周。它似乎现在可以工作,但改变一件小事,它不再“工作”。

试试这个。添加其他功能,test2

int *test() 
{ 
    int a = 11; 
    return &a; 
} 

int test2() 
{ 
    int b = 13; 
} 

int main() 
{ 
    int *a; 

    a = test(); 
    cout << "after test: " << *a << endl; 

    test2(); 
    cout << "after test2: " << *a << endl; 

    return 0; 
} 

现在是11印刷两次?请注意,它可能仍然打印11两次,但它可能不会。毕竟,我们仍然在这里调侃着未定义的行为。

但我的机器上,我看到:

after test: 11 
after test2: 13 

test2已经遭受重挫,我悬摆指针指着堆栈上的空间。代码不正确。当函数退出并且不再有效时,函数test中定义的变量超出范围。保持对它的引用不会改变这一点。

相关问题