作为参数传递给线程的结构的未定义字段



我有一个以这种方式声明和分配的结构

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->aready->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;

最新更新