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
答案 0 :(得分:6)
在您的代码中,int i;
是intptr ()
函数的本地代码。您无法返回i
的地址并在调用者中使用该地址。它调用undefined behaviour。
详细说明,当i
函数返回时,intptr ()
的生命周期已经结束。您返回(或尝试返回)的地址已变为无效。因此,使用返回值,UB。
之后,请注意
k
和l
属于int
类型,您尝试来存储int *
。错误。结果是实现定义的(参见§6.3.2.3,C11
),很可能这不是你想要的代码。 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);
}