2
void func(char *p)
{
    int q = 13;
    p = &q;
    printf("%d\n", *p);
}

void main(void)
{
    int var = 20;
    int *p = &var;

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

    func(p);

    printf("%d\n", *p);
}

为什么在函数退出时指针仍然是 20?我在func()结束时跳跃,指针在其中被修改,最后printf()*p值将指向堆栈中的一些随机内容。

4

2 回答 2

6

你拥有的是这个

void func(char *p)
{
    int q = 13;
    p = &q;
}

这意味着“使 p 指向 q”并更改 的值p,这只是函数内部的一个变量。没有变量值的变化反映在函数之外。

如果你要写这个

void func(char *p)
{
    int q = 13;
    *p = q;
}

这将意味着“使指向的变量将p其值更改为 13”,这将在外部看到,这意味着varmain 中的变量将更改其值(取决于字节顺序,因为它是 int 而不是 char 作为指针声称它是)。

如果要更改 main 中指针的值,则需要一个双指针:

void func(char **p)
{
    int q = 13;
    *p = &q;
    printf("%d\n", *p);
}

这意味着“使指向的指针p指向一个局部变量q”,在这种情况下,您将有一个悬空指针,正如您在main.

于 2019-03-26T10:27:01.970 回答
3

不,p它本身被传递为值。p对inside所做的任何更改func()都不会反映回main().

p为了完整起见,对(ie, )指向的值所做的任何更改都*p将反映在main().

于 2019-03-26T10:12:45.890 回答