2012-03-13 1 views
0

クライアントからのリクエストごとに、サーバー上のファイルを取得するスレッドを作成しています。スレッド関数は通常、voidポインタを取得します。私はパラメータとしてcharポインタを与え、スレッド関数によってファイル名が設定されるようにする必要があります。スレッド関数のvoid *パラメータの変更方法

pt_ret = pthread_create(&thread_id, NULL, getfiles, (void*) thread_buff); 
pthread_join(thread_id, pt_ret); 

デフ:

コードは、スレッドを作成します。スレッド機能の:

void *getfiles(void *ptr) { 
    /* ... */ 
    char buff[256]; // populating that local buffer with the file names 
    // ptr should be as a return of buff 
} 

私は別のものを試しましたが、そのスレッドが完了するたびに、thread_buffはちょうど 'Q'になります。

+1

Cでvoid *へのポインタをキャストする必要はありません。 –

+0

もっとコードを投稿できますか? – Jay

答えて

2

あなたはそれが実際にのchar *である知っているので、ちょうどのchar *にキャスト:

void *getfiles(void *ptr) { 
    /* ... */ 
    const char *ptr_char = (const char*)ptr; 
    char buff[256]; 
    memcpy(buff, ptr_char, 256); //just as an example, check the sizes. 
    //you could also strcpy, that's up to you 
} 

それとも、また、それをコピーせずに、ptrが指すバッファに仕事ができるので、それはですスレッドが終了した後にアクセス可能:

void *getfiles(void *ptr) { 
    /* ... */ 
    char *buff = (char*)ptr; 
    /* do stuff with buff. */ 
} 
+0

動作しませんでした。出力はまだ 'Q'です。 –

+0

編集し、2番目の解決策を確認します。 – mfontanini

+0

キャストは不要で難読化されています。単にそれを割り当てます。 –

0

私は問題は、あなたのスレッドの "buff" varに格納されたデータをスレッドが終了した後に使用したいと思っていると思います。これは不可能です。データは一時的にスタックにのみ存在します。あなたがcharを渡す必要が** ptrは、バフのコピーを移入し、同様

:(*無効)

*ptr = strdup(buff) 

そして渡すスレッドにthread_buff & thread_buffの代わりに、(void *型)関数。

+0

charへのポインタへのポインタを渡す必要があるのはなぜですか?バッファは、スレッドが終了した後でも、char * – mfontanini

+0

を使用すると使用できます。そのため、thread_buffはスレッドのbuff varのコピーを指します。しかし、私はopのコメント 'ptrが狂気の返還であるべきである'と告白する必要があります。 – huelbois

関連する問題