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 を呼び出す前にメインで初期化したフィールドがスレッドで定義されていないことは明らかです。

void* worker_start(void *param) {
    t *current;

    current = (t*) param;
    ...
}

コードの何が問題になっていますか? 私はここで何か悪いことをしていますか?

4

4 に答える 4

2

ポインターをスレッドに渡すときは、それをポインターへのポインターとして渡します ( address-of operator を使用しているため&)。それを行う必要はありません。スレッド関数では、ポインターをポインターからポインターとしてではなく、単なるポインターとして扱います。

スレッドを作成するときにアンパサンド ( &) を削除すると、はるかにうまく機能するはずです。

于 2012-10-10T13:14:02.113 に答える
0

1 つの問題は、フィールド 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 に答える