我有一个以这种方式声明和分配的结构
typedef {
char* a; char* b; int c; int d; FILE *e;
} t;
[...]
ready= malloc(sizeof(t));
strncpy (ready->a, ss1, length);
strncpy (ready->b, ss2, length);
ready->c= f; ready->d= g;
ready->e= fopen(file, "w");
我想传递给线程
pthread_create(thread_id, NULL, worker_start, &ready);
当我开始在线程函数中做一些事情时,很明显我在调用 create 之前在 main 中初始化的字段没有在线程中定义。
void* worker_start(void *param) {
t *current;
current = (t*) param;
...
}
代码有什么问题?我在这里做坏事了吗?
当您将指针传递给线程时,将其作为指向指针的指针传递(由于您使用了地址运算符 &
)。您不需要这样做,并且在线程函数中,您不会将其视为指针到指针,而只是普通指针。
创建线程时删除与号 ( &
),事情应该会更好。
一个问题是文件 a 和 b 是指向字符的指针,不会为字符分配内存。
要么将它们指向字符串
ready->a = ss1;
ready->b = ss2;
或复制字符串
ready->a = strdup( ss1 );
ready->b = strdup( ss2 );
另一个问题是根据@JoachimPileborg的回答
ready->a
和ready->b
指向哪里?看起来像您通过未初始化的指针编写的内容。
正如Joachim Pileborg所说,你不应该传递指向指针的指针。
只是做 :
pthread_create(thread_id, NULL, worker_start, ready);
并且不要忘记使用关键字 结构 :
typedef struct t_type {
char* a; char* b; int c; int d; FILE *e;
} t;