2016-12-30 30 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。あなたの編集で

、あなたはそれで何out指摘するfoo割り当てを持っている必要がありますへ:

*out = src; 
+0

私は理解しています。あなたが私の編集を喜ばせることができます、私はそれがうまくいくはずだと誤解していない場合。 – Mykybo

+2

はい、そうです、私は座って、私がしたいことを明確に考えなければなりませんでした。最終的なコードで編集。 – Mykybo

+1

明確に考えることは常に良い考えです。 –

0

ものが値で関数に渡されます。関数の値を変更すると、外界では何も変わりません。

+0

私の編集内容を見ていただけますか? – Mykybo