C 对代码行为的解释

C 对代码行为的解释,c,pointers,pthreads,C,Pointers,Pthreads,我一直在学习《多线程教程》 并对提供的一些代码进行了实验 我使用了这个源文件 然后将其添加到主功能中: void * v; v = (void *)t; 并替换了这一行: rc = pthread_create(threads+t, NULL, PrintHello, (void*)t); 据此: rc = pthread_create(threads+t, NULL, PrintHello, v) 可以说(我知道这不是一个好论点:),输出应该保持不变。。 但这是新的输出: I

我一直在学习《多线程教程》 并对提供的一些代码进行了实验

我使用了这个源文件 然后将其添加到主功能中:

   void * v;
   v = (void *)t;
并替换了这一行:

rc = pthread_create(threads+t, NULL, PrintHello, (void*)t);
据此:

rc = pthread_create(threads+t, NULL, PrintHello, v)
可以说(我知道这不是一个好论点:),输出应该保持不变。。 但这是新的输出:

In main: creating thread 0
In main: creating thread 1
Hello World! It's me, thread #140734232544832!
In main: creating thread 2
In main: creating thread 3
Hello World! It's me, thread #140734232544832!
In main: creating thread 4
Hello World! It's me, thread #140734232544832!
Hello World! It's me, thread #140734232544832!
Hello World! It's me, thread #140734232544832!
线程是垃圾

有人能给我解释一下这是怎么回事吗?为什么输出会发生变化

这是因为t在传递给PrintHello时是按值传递和强制转换的,而现在,在更改之后,我尝试传递指针,而指针的地址被正确传递-该地址不包含t包含的值,因为它是main的本地值


有人能确认/拒绝并修正我的理论吗?

在您的评论之后,您需要更改代码:

long t;
void* v;
v = (void *)t;
for(...)
  //stuff
致:


基本上,在前面的例子中,t是未初始化的,因此它的值是未定义的。然后将其复制到变量v中并传递到pthread中。如果它在for循环中,那么t已经初始化。

您需要向我们显示您添加了
void*v
的位置,当然还有mainah中的以下行。v得到t的值。就在
long t
之后,
t
有一个未定义的值。把它放在for循环中。谢谢pippin1289。我完全忽略了最常见的怀疑,而是想知道这是否是由于调用函数时的强制转换造成的——这当然是一个无效的怀疑。在将v=(void*)t移动到循环中之后,它按照我预期的方式工作:)是的。知道了。我回复了你上面的评论。非常感谢!
long t;
for(...) {
  void* v;
  v = (void*) t;
  //stuff
}