下面写的两组代码有什么区别

时间:2014-06-13 06:52:21

标签: c pointers stack

#include<stdio.h>

int *fun();

main()
{
    int *i;
    i=fun();
    printf("cbgg\n");
    printf("%d",*i);
    getch();
}

int *fun()
{
    int k;
    k=5;
    return (&k);
}

虽然上面写的程序打印了i的垃圾值,但下面编写的程序工作正常,即。输出绝对相关,即5.为什么会这样?

#include<stdio.h>

int inc();

main()
{
    int i;
    i=inc();
    printf(“cbgg\n”);
    printf(“%d”,i);
    getch();
}

int inc()
{
    int k;
    k=5;
    return (k);
}

3 个答案:

答案 0 :(得分:4)

主要区别在于这个通过返回局部变量的地址(在堆栈上分配)来做一件非常讨厌的事情 - 以后使用返回的指针会调用未定义的行为。

int *fun()
{
    int k;
    k=5;
    return (&k);
}

另一个只是fun()例程中5的无害回报。

答案 1 :(得分:1)

要理解这一点,您需要了解一些参数如何传递给函数和从函数传递。当调用“fun”时,“fun”的参数被推到堆栈上(除此之外)。为了“有趣”返回值,它将它们推送到堆栈上,然后调用者弹出值。

局部变量int k具有函数范围,因此当函数“fun”退出时,所使用的堆栈空间被破坏。返回指向被破坏的内存区域的指针是未定义的行为,这是您返回&amp; k时正在执行的操作。在#2中,你改为在堆栈上推送k的值,这是有效的。

答案 2 :(得分:0)

在第一种情况下,您将返回指向局部变量的指针,其范围仅限于函数。 无论何时从函数堆返回都会被修改,并且会得到意外的数据。