C 指向指针用法的指针产生意外结果

C 指向指针用法的指针产生意外结果,c,pointers,C,Pointers,为什么第一个打印语句主要是打印11 #include<stdio.h> void foo(int ** p){ int j = 11; *p = &j; printf("%d ", **p); //Printing 11 } int main(){ int i = 10; int *p = &i; foo(&p); printf("%d ", *p); //Pri

为什么第一个打印语句主要是打印11

#include<stdio.h>
void foo(int ** p){
    int j = 11;
    *p = &j;
    printf("%d ", **p);        //Printing 11
}

int main(){
    int i = 10;
    int *p = &i;
    foo(&p);    
    printf("%d ", *p);          //Printing 11
    printf("%d ", *p);          //Printing Random value
    return 0;
}
在foo内部,您将自动局部变量j的地址分配给*p。在foo完成执行后,j不再存在,因此,在main调用中进一步使用对p的去重排序


现在,UB的输出是未定义的。

我同意你的答案,但问题是,为什么第一个Printf主要打印的是正确的值,即11?@arvindrajp但它似乎打印的是正确的值,但无法保证它会一直打印。这就是UB的魅力所在-@ArvindRajput:第一次调用printf时,该值可能会保留在堆栈上,但实际的printf调用会覆盖它。不过,你不能指望这种行为。