2017-05-08 1 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

가 작은 동전에서, i 값이 문

(*ptr)++ 

에서 0에서 1로 증가 스레드 때문에 값이 당신이 4

i = i + 4; 

하여 증가 완료되면 5

2

doit()에서 i이 (주 함수 전달 된) 1만큼 증가했습니다. 참조에 의해) 그리고 당신이 그것에 4를 추가 한 스레드가 합류 한 후에.

당신이 함수 작은 동전의 INT에 doit().

1
  • 에, 대신 그것을 증가의 전달 매개 변수에 3을 추가했을 수 (8)을 얻으려면 전 = 3; doit 함수의 지역 변수입니다. 은 main에 선언 한 것과 관련이 없습니다. 그래서 거기에 추가하는 것은 주 기능에서 나는 아무런 영향을 미치지 않습니다. 제거 할 수 있습니다.

    • 다음으로 (* ptr) ++는 main 함수에서 선언 한 i를 가리키는 포인터 vargp를 1 씩 증가시킵니다. 따라서 i는 1이되고 다음은 4가됩니다. 그래서 결과는 5입니다. 증가 (* ptr)를 3 번 ​​또는 doit에 지정하려면 vargp 변수를 2로 지정하면 do (* ptr) ++가 한 번만 출력되고 출력이 표시됩니다.