当前位置:  开发笔记 > 编程语言 > 正文

那会错吗?如果是这样,为什么呢?输出是2500

如何解决《那会错吗?如果是这样,为什么呢?输出是2500》经验,为你挑选了2个好方法。

以下代码的输出是2500.它包含指针.有人可以给出正确的解释吗?为什么打印为2500?它是通过指针声明还是有另一个原因?

#include 

/* Two functions include and they are operated by main function */

int *f(int x) {
    /* Creates an variable */
    int p;
    p = x;
    return &p;
}

/* Here the initialization of the function g */
int *g(int x) {
    /* Creates an variable */
    int y;
    y = x;
    return &y;
}

/* This creates two pointers called x and y */
int main() {
    int *x, *y;
    /* Here call the functions f and g */
    x = f(100);
    /* Here call the function g */
    y = g(2500);
    /* How does it print 2500? */
    /* print the value of x */
    printf("%d \n", *x);
    return 0;
}

haccks.. 8

您获得奇怪输出的原因是未定义的行为.您将返回自动局部变量的地址,该函数在函数到达时将不再存在.

虽然,可以根据函数调用的堆栈帧给出输出的解释.由于最后一次调用是for function g并且传递给它2500的参数是,x函数的参数g在堆栈上分配并2500被推送到堆栈.当这个函数返回时,这个值从堆栈中弹出(虽然堆栈帧g在返回调用者后是无效的)并且它可以2500从它的堆栈帧返回它.



1> haccks..:

您获得奇怪输出的原因是未定义的行为.您将返回自动局部变量的地址,该函数在函数到达时将不再存在.

虽然,可以根据函数调用的堆栈帧给出输出的解释.由于最后一次调用是for function g并且传递给它2500的参数是,x函数的参数g在堆栈上分配并2500被推送到堆栈.当这个函数返回时,这个值从堆栈中弹出(虽然堆栈帧g在返回调用者后是无效的)并且它可以2500从它的堆栈帧返回它.



2> Sourav Ghosh..:

在这两个函数中,您尝试返回函数中局部变量的地址.一旦函数完成执行并且控件返回到调用者,返回的地址就变为无效(即,变量超出范围),并且任何使用返回值的尝试都会调用未定义的行为.

如果你必须从一个函数返回一个地址并在调用者中使用它,你将需要一个通过动态内存分配器函数(例如malloc()和family)分配内存的指针.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有