第一次取消引用后,指针指向的值会发生变化

IAm*_*ust 3 c pointers

我试图初始化"init_pointer"函数内的整数指针"p".函数返回后,我打印指针和解除引用的值两次.第一个取消引用打印预期值100,但第二个取消引用打印随机值.

#include<stdio.h>

    void init_pointer(int d, int **c){
            (*c) = &d;
    }

    int main(){
            int x = 100;
            int *p;

            init_pointer(x,&p);

            printf("pointer = %p, value = %d\n",p,*p);
            printf("pointer = %p, value = %d\n",p,*p);

            return 0;
    }
Run Code Online (Sandbox Code Playgroud)

输出:

pointer = 0x7fffb4d4b9ac, value = 100
pointer = 0x7fffb4d4b9ac, value = 32567
Run Code Online (Sandbox Code Playgroud)

Sad*_*que 9

该函数已将值复制到新的局部变量中 init_pointer(int d, int **c)

d是本地的init_pointer这是路过mainx.这两个xd是独立的变量,其地址是不同的.访问d外部地址init_pointer将导致未定义的行为.

调用这样的函数是没有意义的,但这样可行:

void init_pointer(int *d, int **c)
{
        (*c) = d;
}

int main()
{
        int x = 100;
        int *p;

        init_pointer(&x,&p);

        printf("pointer = %p, value = %d\n",p,*p);
        printf("pointer = %p, value = %d\n",p,*p);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

pointer = 0xbfde132c, value = 100
pointer = 0xbfde132c, value = 100
Run Code Online (Sandbox Code Playgroud)