我试图将结构传递给函数以便利用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;
就像我说的那样,我尝试了一些不同的东西,但我无法做到。谢谢你的帮助。
答案 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;
这种语法可能令人困惑,因此请务必查看*
运算符的工作原理以及它与变量类型中使用的*
的不同之处。