2017-05-08 105 views
-2

當我運行下面的程序時,輸出是5.
爲什麼5?爲什麼不是8?以下程序的輸出

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

在DOIT,i的值從0增加到1在聲明

(*ptr)++ 

之後線程完成你的4

i = i + 4; 

增加它所以價值5

2

doit()你已經增加了i 1(通過主函數通過參加),並在線程加入後,你添加了4。

拿到8或者你自己加入3〜傳遞的參數,而不是僅僅增加它,在doit().

1
  • 在功能DOIT INT I = 3;是doit函數的局部變量,它是 與您在main中聲明的i無關。因此,在主要功能中,添加對i沒有影響。你可以刪除它。

    • 接下來,(* ptr)++增加指向我在main函數中聲明的1的指針vargp。所以,在那裏我變成了1,接下來你就是增加了4。所以結果是5. 如果你想要8次遞增(* ptr)3次或在doit中指定vargp變量爲2,那麼do(* ptr)++只會出現一次並且看到輸出。