为什么这个函数在第一次调用后没有返回指针?

时间:2015-07-31 08:21:54

标签: c pointers

int* intptr ()
{
    int i;
    i=rand();
    printf("%d_____",i);
    return(&i);
}

int main()
{
    int* j,k,l;
    j=intptr();
    k=intptr();
    l=intptr();
    printf("%d/n",j);printf("%d/n",k);printf("%d/n",l);
}

这里intptr函数在第一次调用中返回一个指针,之后所有后续调用都返回int 2752220

3 个答案:

答案 0 :(得分:6)

在您的代码中,int i;intptr ()函数的本地代码。您无法返回i的地址并在调用者中使用该地址。它调用undefined behaviour

详细说明,当i函数返回时,intptr ()的生命周期已经结束。您返回(或尝试返回)的地址已变为无效。因此,使用返回值,UB。

之后,请注意

  1. kl属于int类型,您尝试来存储int *。错误。结果是实现定义的(参见§6.3.2.3,C11),很可能这不是你想要的代码。
  2. j是一个指针,打印指针地址的正确方法是使用

    printf("%p/n",(void *)j)
    

    使用错误类型的参数(%d期望int,而不是int *)又是UB。

答案 1 :(得分:5)

其他答案解决了未定义的行为,这是您的代码示例所展示的不良编码实践。但是,如图here所示,真正的问题是当您定义

int* j,k,l;

只有第一个变量j是一个int指针。其他是常规整数。为了使它们成为所有指针,你必须像这样定义它们:

int* j; 
int* k;
int* l;

通过偶然运行代码,每个指针可能指向函数中相同的已删除值,但至少它们是指针而不是整数。

答案 2 :(得分:2)

您正在尝试返回函数intptr()的本地函数,因此即使第一次调用您获得的输出也是如此,它无效。这是未定义的行为。因为在堆栈展开发生后(控件从inptr()返回到main()i消失,并且无法找到其地址的任何值。

你可以让它静止工作。

int* intptr ()
{
    static int i = 0;
    i=rand();
    printf("%d_____",i);
    return(&i);

 }