将结构作为void *指针传递时,初始化程序无效

时间:2016-11-09 22:18:17

标签: c pointers struct pthreads void

我试图将结构传递给函数以便利用C中的多线程。我真的不明白它是如何工作的,所以我尝试了各种语法各种错误消息,所以我不确定我之前是否已回答过我的特定查询。我把最简单的代码放在一起,它类似于我想要做的事情,它仍然给我一个错误,即使我把它设置为匹配这个显然适用于人们的网站上的类似示例。我希望我能错过一些非常简单的事情。无论如何,这里的代码不会编译:

#include <pthread.h>
#include <stdio.h>

typedef struct {
    int i_start;
    int i_end;
} my_struct;

void *func(void *ptr) {

    int j_start;
    int j_end;

    my_struct input = (my_struct *) ptr;
    j_start = input.i_start;
    j_end = input.i_end;
    printf("%d %d\n", j_start, j_end);

}

int main() {
    my_struct qwerty;

    qwerty.i_start = 0;
    qwerty.i_end = 1;

    pthread_t tid;

    pthread_create(&tid, NULL, func, &qwerty);

    return 0;
}

这个特殊的代码给了我一个编译错误:

test.c: In function 'func':
test.c:14:20: error: invalid initializer
  my_struct input = (my_struct *) ptr;

就像我说的那样,我尝试了一些不同的东西,但我无法做到。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

  

my_struct input = (my_struct *) ptr;

input的类型为my_struct,您正在尝试为其分配my_struct *值(指向my_struct的指针)。类型必须匹配。

尝试使用指针类型并取消引用它(以获得普通的my_struct值):

my_struct *input = (my_struct *) ptr;
j_start = (*input).i_start;
j_end = (*input).i_end;

或者使用箭头操作符指针本身:

my_struct *input = (my_struct *) ptr;
j_start = input->i_start;
j_end = input->i_end;

或者你可以在转让前取消引用:

my_struct input = *((my_struct *) ptr);
j_start = input.i_start;
j_end = input.i_end;

这种语法可能令人困惑,因此请务必查看*运算符的工作原理以及它与变量类型中使用的*的不同之处。