0

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

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;
    ...
}

代码有什么问题?我在这里做坏事吗?

4

4 回答 4

2

当您将指针传递给线程时,您将其作为指向指针的指针传递(由于您使用了 address-of 运算符&)。您不需要这样做,并且在线程函数中您不会将其视为指向指针的指针,而只是普通指针。

创建线程时删除与号(&),事情应该会更好。

于 2012-10-10T13:14:02.113 回答
0

一个问题是文件 a 和 b 是指向 char 的指针,并且不为字符分配内存。

要么只是将它们指向字符串

ready->a =  ss1;
ready->b =  ss2;

或复制字符串

ready->a = strdup( ss1 );
ready->b = strdup( ss2 );

另一个问题是根据@JoachimPileborg 的回答

于 2012-10-10T13:13:49.480 回答
0

在哪里做ready->aready->b指向?看起来你的写作是通过未初始化的指针。

于 2012-10-10T13:15:05.937 回答
0

正如 Joachim Pileborg 所说,您不应该将指针传递给指针。

做就是了 :

pthread_create(thread_id, NULL, worker_start, ready);

并且不要忘记使用关键字 STRUCT :

typedef struct t_type {
 char* a; char* b; int c; int d; FILE *e;
} t;
于 2012-10-10T13:44:54.077 回答