C 具有相同主体和不同参数的两个不同函数在同一内存位置返回值
我不能清楚地理解这里发生了什么C 具有相同主体和不同参数的两个不同函数在同一内存位置返回值,c,pointers,C,Pointers,我不能清楚地理解这里发生了什么 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int *f(int x){ int p; p=x; return &p; } int *g(int x){ int y; y=x; return &y; } int main(){ int *x,*y; x=f(1000);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int *f(int x){
int p;
p=x;
return &p;
}
int *g(int x){
int y;
y=x;
return &y;
}
int main(){
int *x,*y;
x=f(1000);
y=g(250);
*x = *x + 250;
printf("%d\n",*y);
return 0;
}
产量:-500
为什么线*x=*x+250改变*y值?为什么输出不是250
int *f(int x){
int p;
p=x;
return &p;
}
在这个函数和g中,返回一个局部变量的地址。当调用者使用这个地址时,它是无效的,因为它引用的是一个被销毁的变量,就像使用指向释放的动态内存的指针一样。这将导致未定义的行为。您无法返回局部指针您正在返回指向局部变量的指针,该变量在函数结束后立即超出范围。这里有数百个重复项。这是一个未定义的行为。p和y的生存期在声明它们的函数结束时结束。所以你的代码调用未定义的行为。是的,我得到了那个错误,但不幸的是,这是我们操作系统考试试卷中的一个代码。在那里,他们要求输出。还有什么可以猜测输出500吗?@piumi也许答案只是:这个程序的行为没有定义,因为我们使用指向超出范围的局部变量的指针,因此无法预测输出。检查IMO这是一个技巧性的问题。@piumi如果f函数返回后f中p变量的内存地址没有被覆盖,如果g中的y变量分配在与f函数中p分配的内存位置相同的内存位置,并且g函数返回后y变量的内存地址没有被覆盖,那么结果可能是500。“这是很多假设。”迈克尔非常感谢你的解释