C中的以下输出动态更改的原因是什么
这是我正在处理的代码段。它输出500,但我不明白,为什么会发生这种情况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(){
#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++的,但问题完全一样。