C 以下程序的输出

C 以下程序的输出,c,pthreads,pthread-join,C,Pthreads,Pthread Join,当我运行以下程序时,输出为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);

当我运行以下程序时,输出为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);
}

在doit语句中,i的值从0递增到1

(*ptr)++
线程完成后,将其递增4

i = i + 4;
因此,在
doit()
中,值为5

,您已经将
i
增加了1(通过引用传递的主函数的值),并且在线程连接之后,您向其添加了4

要得到8,您可以在
doit()中向传递的参数添加3,而不是仅仅增加它。
  • 在函数doit int i=3中;是doit函数的局部变量,它是 与您主要声明的i无关。所以做加法对主函数中的i没有影响。您可以删除它

    • 接下来,(*ptr)++将指向主函数中声明的i的指针vargp递增1。所以,我变成了1,下一个你是加法4。结果是5。 如果要将增量(*ptr)设置为8,并执行3次,或者在doit中将vargp变量赋值为2,则只需将do(*ptr)++设置一次即可查看输出

int i=3什么都不做。该行为一个从未使用过的局部变量赋值。线程没有添加任何有意义的内容,因此您的问题可以总结为“为什么下面的代码打印5?”
int i=0;i++;i=i+4。这是因为1+4=5。