3

この例を見てみましょう:

struct args{
    char *fname;
}

int main(void){
    struct args tArg;
    tArg.fname = malloc(10);
    strcpy(tArg.fname, "ciao");
    pthread_create(&p1, NULL, thread, (void *)&tArg);
    pthread_join(p1, NULL);
    free(tArg.fname);
    return 0;
}

void *thread(void *p1Arguments){
    struct args *p1 = p1Arguments;
    printf("%s\n", p1->fname);
}

に何もないため、プログラムをセグメンテーション違反printfthread導きp1->fnameます。
malloc された文字列を渡すにはどうすればよいですか?

編集:申し訳ありませんが、書くのを忘れていましたpthread_join

4

5 に答える 5

1

あなたはそれを正しく渡しました。

あなたfree(tArg.fname);は、しかし、スレッドが使用しようとしていますtArg.fname

// ...

pthread_create(&p1, NULL, thread, (void *)&tArg);

pthread_join(p1, NULL); // <-- PUT THIS AND GIVE A MOMENT TO THREAD

free(tArg.fname);

// ...
于 2013-03-25T17:23:30.500 に答える
1

@Claudiu が述べているように、スレッドが完了するのを待つ以外に、キャストする必要がありますp1Arguments。これは、C 言語でキャストが必要な数少ない場所の 1 つです。

于 2013-03-25T17:23:48.913 に答える
1

その思いは

pthread_create(&p1, NULL, thread, (void *)&tArg);
free(tArg.fname);

間違っています。

スレッドは空きビットを実行する必要があります。

そして、メインは結合します

于 2013-03-25T17:24:46.550 に答える
1

次のようになります。

1) 構造体 tArg で「fname」を正しく割り当てて初期化しています

2)また、tArgをスレッドに正しく渡しています

... しかし ...

3) メインプログラムは、スレッドがアクセスする前に「fname」の割り当てを解除しています (悪い!)

提案:

スレッドを作成した後(および「free()」を呼び出す前)に「getchar()」を配置して、ユーザーが「ENTER」を押すのを待ってから解放して終了するようにします。

于 2013-03-25T17:22:34.863 に答える
0

スタックの問題かもしれません。

渡した targ がスタック上に作成されます。tArg アドレス (メイン プログラムのスタック上) を渡すと、スレッドには独自のスタック セクションがあります。2つの解決策を提案します。

1> malloc tArg 自体で試してください。構造体へのポインタとして宣言します。2> または、tArg をグローバル変数として定義します。これにより、スタック セクションではなく、グローバル データ セクションに強制的に割り当てられます。

于 2013-03-25T17:38:02.237 に答える