2017-05-08 6 views
-2

次のプログラムを実行すると、出力は5になります。
なぜ5ですか?なぜ8ではない? doItで次のプログラムの出力

void *doit(void *vargp) { 
    int i = 3; 
    int *ptr = (int*)vargp; 
    (*ptr)++; 
} 
int main() { 
    int i = 0; 
    pthread_t tid; 
    pthread_create(&tid, NULL, doit, (void*)&i); 
    pthread_join(tid,NULL); 
    i = i + 4; 
    printf("%d",i); 
} 
+2

'int i = 3;'行は何もしません。その行は、決して使用されないローカル変数に値を割り当てます。 – user3386109

+2

スレッドは意味をなさないものを追加しないので、あなたの質問は「なぜ次のコードは5を印刷するのですか?」と要約できます。 'int i = 0;私は+ +; i = i + 4;。 1 + 4 = 5であるからです。 – Lundin

答えて

6

スレッドが実行された後、iの値は、あなたが4

i = i + 4; 

ことによってそれをインクリメント

(*ptr)++ 

声明

で0から1にインクリメントされるので、値があります5

2

doit()あなたはiを1つ増やしました。参照によって)、スレッド参加後に4を追加しました。

あなたは、機能のdoIt int型でdoit().

1
  • で、代わりにそれをインクリメントする渡されたパラメータに3を追加している可能性がある8を取得するために、I = 3; doit関数のローカル変数です。 はメインで宣言したものとは関係ありません。だから、そこに加えても、主な機能には何の影響もありません。削除することができます。

    • 次に、(* ptr)++は、main関数で宣言したiを指すポインターvargpを1だけインクリメントします。したがって、iは1になり、次にあなたは4になります。結果は5です。 増分(* ptr)を3回、またはdoitで実行する場合は、vargp変数を2に設定すると、do(* ptr)++は1回だけ出力され、出力が表示されます。
関連する問題