C 直接返回地址时出现分段错误,但通过指针返回地址时没有错误

C 直接返回地址时出现分段错误,但通过指针返回地址时没有错误,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,版本1给出了分段错误,但当我运行版本2时,它工作正常 为什么? 你所做的被认为是未定义的行为。调用fun时,数字20会写入堆栈。退出fun()时,堆栈指针将递减。现在调用print(),它可能会将自己的变量放入堆栈中,并可能覆盖您在堆栈中编写的内容 基本上,您的两个示例都是糟糕的代码,可能会导致不同的行为,具体取决于您使用的架构、加载地址、月相等。运气好吗?两者都不正确,因为它们返回指向堆栈上不再在作用域中的数据的指针 那是什么语言?什么是打印?如前所述,它显然不是C,尽管它与C相似。您不能返回

版本1给出了分段错误,但当我运行版本2时,它工作正常

为什么?


你所做的被认为是未定义的行为。调用
fun
时,数字
20
会写入堆栈。退出
fun()
时,堆栈指针将递减。现在调用
print()
,它可能会将自己的变量放入堆栈中,并可能覆盖您在堆栈中编写的内容


基本上,您的两个示例都是糟糕的代码,可能会导致不同的行为,具体取决于您使用的架构、加载地址、月相等。

运气好吗?两者都不正确,因为它们返回指向堆栈上不再在作用域中的数据的指针

那是什么语言?什么是打印?如前所述,它显然不是C,尽管它与C相似。您不能返回指向局部变量的指针。它导致UBNote:
C
标签是由原始海报以外的人添加的。代码位于“C”。。很抱歉没有提到我刚才在这里写的部分代码的语言。顺便说一句,我的问题是返回地址(&i)和通过指针(return ptr;)返回“i”的地址有什么区别,因为当我返回&i时,我会出现分段错误,但当我返回“ptr”时,我能够从main打印“ptr”所指地址的值。
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;
}