Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 具有相同主体和不同参数的两个不同函数在同一内存位置返回值_C_Pointers - Fatal编程技术网

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。“这是很多假设。”迈克尔非常感谢你的解释