2016-12-30 31 views
0

我无法理解,为什么这个工程:C指针怪异的行为

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; 
} 
+0

你正在影响本地'int ** out'在函数中不是从main传入的,这是传递值的慢性问题 – Raindrop7

回答

4

在第二,在main变量out不受内完成了任务foo

在你的编辑,你需要有foo分配到out在它指向什么:

*out = src; 
+0

我明白了。你可以请我的编辑,如果我现在没有弄错它应该工作。 – Mykybo

+2

是的,你是对的,我不得不坐下来想清楚我想做什么。在最终的代码中编辑。 – Mykybo

+1

清晰思考总是一个好主意。 –

0

事情是按值传递给函数。改变函数中的值不会改变外部世界。

+0

你可以看看我的编辑(在问题中)? – Mykybo