能解释解释这里有关p的变化吗

  1. What is the output of this C code?

    #include
    int main()
    {
    int i = 10;
    int *p = &i;
    foo(&p);
    printf("%d ", *p);
    printf("%d ", *p);
    }
    void foo(int **const p)
    {
    int j = 11;
    *p = &j;
    printf("%d ", **p);
    }
    a) 11 11 11
    b) 11 11 Undefined-value
    c) Compile time error
    d) Segmentation fault/code-crash
    View Answer

Answer:b

    int i = 10;
    int *p = &i;
    foo(&p);
    printf("aadfa");
    printf("%d ", *p);  //
    printf("%d ", *p); // 

    这两个输出都是未知数。。应为foo的内部变量已经释放完全,*p等于野指针。。

foo()是一个子函数,其内部定义的变量,在函数生存期结束后,申请的变量空间都会释放;
对于foo()内部的输出,为11,这个函数形参为二级指针,可以改变外部指针的指向,但是当函数结束时,指针所指的指针已经不存在了!
对于第二个输出,理论上应该是0或者其他,那是因为p已经为野指针了,但是刚好内存区还有一个值为11,所以刚好就把11输出来了,如果你想验证
的话,你可以在foo(%p);后面随便再输出一个东西,比如printf("hello");
此时,两个*p的值都应该一样的,默认为0。