2017-08-24 54 views
-1

版本1给出了段错误,但是当我运行版本2时,它工作正常。直接返回地址时出现分段错误,但通过指针返回时没有错误

为什么?

main() 
{ 
    int *p; 
    p=fun(); 
    print p; 
    print *p 
} 

//version 1 gives segmentation fault 
int *fun() 
{ 
    int i=20; 
    return &i 
} 

//version 2 runs fine 
int *fun() 
{ 
    int i=20; 
    int *ptr=&i; 
    return ptr; 
} 
+1

那是什么语言?什么是'打印'?正如所写的,它显然不是C,尽管它与它相似。 –

+0

你不能返回指向局部变量的指针。它的结果是UB – pm100

+0

注意:'C'标记是由原始海报以外的人添加的。 –

回答

0

你在做什么被认为是未定义的行为。当您拨打fun时,号码20被写入堆栈。当您退出fun()时,堆栈指针会递减。现在你打电话print(),这可能会把自己的变量放到堆栈中,并可能覆盖你写在那里的任何东西。

基本上,无论你的例子是糟糕的代码,并可能导致这取决于你使用的是什么架构,负载地址,月亮的相位不同的行为,等等

1

运气?两者都是不正确的,因为它们正在返回指向堆栈中不再在范围内的数据的指针。