2016-12-30 32 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