C,转换通过void指针传递的结构数组

时间:2013-06-29 09:59:47

标签: c pointers struct pthreads

我陷入了一个简单的指针/投射问题:

我尝试将pthread函数作为参数传递给pthread_create中包含2个结构的数组。这是代码:

struct sockaddr_in addr_left, addr_right;
struct sockaddr_in* addr_vec [2] = {&addr_left, &addr_right};
pthread_create (&thread_forward,   NULL, thread_func_forward, (struct sockaddr**)addr_vec); 

在thread_func_forward内部:

void * thread_func_forward (void * argv) {
  struct sockaddr_in* addr_left = ((struct sockaddr_in*)argv + 0);
  struct sockaddr_in* addr_right = ((struct sockaddr_in*)argv + 1);
}

由于某种原因,它无法正常工作,程序可以执行最后一行而不会出现分段错误但是当我访问结构的成员时,它们会完全改变

2 个答案:

答案 0 :(得分:3)

您没有将线程参数强制转换为正确的类型。您的代码将线程参数强制转换为struct sockaddr_in *,但这不是正确的类型。 addr_vec是一个指针数组,因此addr_vec会衰减为指向指针的指针。

由于您传入指向指针的指针,因此您应该在线程函数中将其强制转换为指针。然后,您需要取消引用它以获取所需的指针。

  struct sockaddr_in* addr_left = *((struct sockaddr_in**)argv + 0);
  struct sockaddr_in* addr_right = *((struct sockaddr_in**)argv + 1);

这些是从创建线程的函数指向本地自动变量的事实可能是也可能不是问题。这取决于该函数是否在这些变量超出范围之前等待线程完成。

答案 1 :(得分:1)

您的addr_vec生活在自动存储中(即堆叠中),但没有迹象表明您已采取任何措施确保变量的使用寿命至少持续至少在线程中访问它们。

简而言之,您需要在创建线程之前动态分配然后在线程中释放它,或者使用同步原语来防止您创建线程的函数在您在线程本身中复制之前返回。