与c中的指针有关的问题

时间:2012-08-19 11:00:24

标签: c linux pointers

#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的值应该是一些垃圾值作为栈改变了。

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

3 个答案:

答案 0 :(得分:3)

Dangling Pointer的情况。在提供任何Undefined时,引用悬​​空指针为unpredictable value

答案 1 :(得分:1)

这是非常危险的编码

int *p,*q;

    p = &i;
    q = &j;

我&amp; 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);
    }

答案 2 :(得分:0)

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