2017-01-11 10 views
1

私はここ数時間、Googleに取り組み、自分のコードに何が間違っているのか把握しましたが、わかりませんでした。構造体を使って複数の引数を渡すPOSIXスレッド

私は学生であり、スレッドなどについて学び始めたばかりです。これは私には全く新しいものです。経験はあまりありません。

Googleでの回答は、通常、コードの特定の問題に対する回答であり、実際にこの問題を解決する方法を見つけることができませんでした。だから私は、私は、関数thread_funcに複数の引数を渡すために使用する構造体のデータを持っている

http://pastebin.com/wst8Yw8z

#include <iostream> 
#include <string> 
#include <pthread.h> 
#include <unistd.h> 
#include <stdlib.h> 

using namespace std; 

struct Data{ 
    string a; 
    string b; 
}; 

void* thread_func(void *param){ 

    struct Data *input = (struct Data*)param; 

    string data1 = input->a; 
    string data2 = input->b; 

    cout << "You said: " << data1 << " " << data2 << endl; 

    return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t child; 
    string arg, arg2; 

    struct Data *input; 

    cout << "Input 1: " << endl; 
    cin >> arg; 
    cout << "Input 2: " << endl; 
    cin >> arg2; 

    input->a = arg; 
    input->b = arg2; 

    pthread_create(&child, NULL, thread_func, (void *)&input); 

    pthread_join(child, NULL); 
    cout << "Synced" << endl; 
    return 0; 
} 

は、ここに私のコードの非常に単純化したバージョンです。

私のコードは実際に(少なくともLinux上で)コンパイルされますが、両方の値を入力するとSegmentationフォルトが発生します。

私は明らかに何か間違っています。私の推測は18行目ですが、私自身はこれを理解するのに十分な経験はありません。私はあなたに助けを求めています。

関数に複数の引数を渡すには、この構造体で何が間違っていますか?

私の実際の割り当てはこれより少し複雑ですが、私は可能な限り明確にするために最善を尽くしました。

答えて

4

、この:

struct Data *input; 

struct Dataへのポインタを作成しますが、実際のstruct Dataオブジェクト自体を作成しません。あなたは、ここで使用する必要があります。

struct Data input; 

、その後:

input.a = arg; 
input.b = arg2; 

、残りは正常に動作する必要があります。

+0

ありがとう、この解決策は問題を解決しました。手伝ってくれてありがとう。 :) –

3

このライン:

struct Data *input;

はポインタとして入力を定義しますが、それは後でここにあなたの文字列を格納するためにそれを使用する前にオブジェクトを割り当てたことがない:

への通話に基づいて
input->a = arg; 
input->b = arg2; 

pthread_createinputをポインタにしたくないと思われます。 *を外し、に割り当てを変更:あなたのmain()機能で

input.a = arg; 
input.b = arg2; 
+0

ありがとうございます。これで問題は解決しました。どうもありがとうございます。 :) –

関連する問題