1
#include<stdio.h>
int* check(int,int);

int main()
{
    int *c,t = 2;
    c = check(10,20);
    printf("t = %d\n",t);
    printf("c = %d\n",*c);

    return 0;

}

int* check(int i,int j)
{
    int *p,*q;

    p = &i;
    q = &j;

    if(i>=45)
       return (p);
    else
       return (q);
}

我得到的代码输出为:

t = 2
c = 2

为什么?因为根据概念返回给c的值是j地址,即*c的值是20,但是由于c的printf语句之前有一个printf语句,因此,*c的值应该是一些垃圾值作为堆栈被改变。

任何人都可以帮助我吗?请帮忙 !!

4

3 回答 3

3

悬空指针就是这种情况。引用悬空指针是Undefined什么时候可以给出任何unpredictable value.

于 2012-08-19T11:08:54.963 回答
1

这是非常危险的编码

int *p,*q;

    p = &i;
    q = &j;

i & j 两个值都在堆栈上,一旦检查程序结束,它们就会从内存中删除。

通过传递左值而不是右值以其他方式执行此操作(因为您想要返回指针)

#include<stdio.h>
    int* check(int*,int*);

    int main()
    {
        int *c,t = 2;int dummy=30;
        c = check(&t,&dummy);
        printf("t = %d\n",t);
        printf("c = %d\n",*c);

        return 0;

    }

    int* check(int *i,int *j)
    {

        if(*i>=45)
           return (i);
        else
           return (j);
    }
于 2012-08-19T11:09:08.210 回答
0

编辑:在我的 gcc C 上被破坏了 :) 所以你很幸运。只是不要在生产中这样做:)
实际上 gcc -O3 表现出无堆栈更改行为,而 gcc 更改堆栈。所以“未定义的行为”。

于 2012-08-19T11:07:09.623 回答