C中的以下输出动态更改的原因是什么

C中的以下输出动态更改的原因是什么,c,pointers,C,Pointers,这是我正在处理的代码段。它输出500,但我不明白,为什么会发生这种情况 #include<stdio.h> int *f(int x){ int p; p = x; printf("p is : %d\n",p); return &p; } int *g(int x){ int y; y = x; printf("p is : %d\n",y); return &y; } int main(){

这是我正在处理的代码段。它输出500,但我不明白,为什么会发生这种情况

#include<stdio.h>

int *f(int x){
    int p;
    p = x;
    printf("p is : %d\n",p);
    return &p;
}

int *g(int x){
    int y;
    y = x;
    printf("p is : %d\n",y);
    return &y;
}

int main(){
    int *x,*y;
    x = f(1000);
    y = g(250);
    *x = *x +250;
    printf("%d %d\n",*x,*y);

    return 0;
}

输出500的原因是什么?

您正在返回一个局部变量的地址

函数f和g中变量p和y的生存期在这些函数返回时结束。结果,指向它们的指针变得无效,尝试取消引用它们会导致错误


直接返回值而不是返回指针。

查看函数:

int *f(int x){
    int p; 
    p = x;
    printf("p is : %d\n",p);
    return &p;
}
警告:返回了局部变量“p”的地址 [-Wreturn本地地址]

这里变量p是在函数调用返回后在f的范围内创建的。这个函数堆栈框架被破坏,其中的所有内容也被破坏,从而产生意外的结果。
您可以直接返回值,也可以使用malloc动态分配内存,在这种情况下,变量将存储在heap而不是f中,或者特定的函数堆栈稍后可以在完成后释放内存。

您使用的是超出范围的变量地址。我们的编译器没有警告您返回堆栈指针吗?@Blaze程序没有返回堆栈指针,它返回指向局部变量的指针。@FiddlingBits:适用的概念是生存期或存储持续时间,而不是作用域。我已作为的副本关闭。虽然这个问题是关于C++的,但问题完全一样。