c语言函数与指针的问题



#include<stdio.h>
int* a(int *np)
{
    int b=10;
    np=&b;
    return np;
}
int main()
{
    int n=5;
    int *p=&n;
    p=a(p);
    printf("%d\n",*p);
}

上面的程序为什么会打印出结果10?在a函数中定义了一个临时变量b,在函数结束后b不是就消失了吗,按理说p就访问不到了,可还是打印了b的值
下面的程序仅仅多了一行代码却就打印不出b的值了

#include<stdio.h>
int* a(int *np)
{
    int b=10;
    np=&b;
    return np;
}
int main()
{
    int n=5;
    int *p=&n;
    p=a(p);
    printf("%p\n",&p);
    printf("%d",*p);
}

上面的程序打印出结果10是因为a函数中返回了一个指向b的指针,p指向了这个指针,所以*p即为b的值。但是在a函数中定义的临时变量b是一个局部变量,函数结束后会被销毁,所以使用它的地址是不安全的,实际上这样做是一种未定义行为,在不同的编译器和环境下可能会产生不同的结果。

下面的程序多了一行代码:在main函数中打印了p的地址。这并不影响p指向的地址,但是会导致p的地址被输出,与指向b的指针的地址不同。因此,第二个printf语句将尝试访问错误的地址,结果是未定义的。在某些情况下,可能会输出0或其他值,但不能保证始终如此。

img


断点到这一步可以看到,指针p的地址没问题,指针p的值没有问题

img


当打印指针p的地址的时候,就和楼上说的一样,临时变量的值被销毁,相当于指针p未定义了,结果指针p的值变了

img

img

不管你前面的语句打印了什么,值都被销毁了