C指针奇怪的行为

时间:2016-12-30 23:42:34

标签: c pointers

我无法理解为什么会这样有效:

int main() {
    int test = 4;
    int *bar = &test;
    int **out = &bar;
    printf("%d\n", **out);
    return 0;
}

但这不是:

void foo(int *src, int **out) {
    out = &src;
}

int main() {
    int test = 4;
    int *bar = &test;
    int **out;
    foo(bar, out);
    printf("%d\n", **out);
    return 0;
}

第二个片段引发“分段错误”。对我来说,似乎他们做同样的事情。有人可以解释一下吗?

编辑:(根据答案更新的代码):

void foo(int *src, int **out) {
    out = &src;
}

int main() {
    int test = 4;
    int *bar = &test;
    int *out;
    foo(bar, &out);
    printf("%d\n", *out);
    return 0;
}

那为什么这不起作用?

解决:(我必须仔细考虑我真正想做的事情),这就是结果:

void foo(int *src, int **out) {
    *out = src;
}

int main() {
    int test = 4;
    int *bar = &test;
    int *out;
    foo(bar, &out);
    printf("%d\n", *out);
    return 0;
}

2 个答案:

答案 0 :(得分:4)

在第二个中,out中的变量main不受foo内作业的影响。

在您的修改中,您需要foo分配其中out指向的内容:

*out = src;

答案 1 :(得分:0)

事物按价值传递到函数中。更改函数中的值不会改变外部世界。