1

Cの関数ポインタとスレッドについて学習しています。次のコードは、ユーザーから文字列を読み取るスレッドを作成します。次に、ユーザーがメインスレッドに入力した名前を出力します。しかし、セグメンテーション違反が発生しました:11

#include<pthread.h>
#include<stdio.h>

int agelimit;
char *string1, *string2;
void *getName();
//void (*getAge)();
main(){

    pthread_t thread1,thread2;

    string1 = malloc(1000);
    //scanf("%s",string0);
    pthread_create(&thread1, 0, getName, 0);


    //pthread_create(&thread2, 0, getAge, 0);
    sleep(10);
    printf("name is %s age is",string1);



}
void *getName(){

    int x;
    printf("enter name:");

    scanf("%s",&string1);
}
4

2 に答える 2

3

あなたのコードはもう少し改善/エラー処理が必要ですが、あなたは変更する必要があるようです

scanf("%s",&string1);

scanf("%s",string1);

今それを動作させるために。

Pl。上の良いチュートリアルについては、リンクを参照してください

POSIXスレッドプログラミング

説明:

string1は変数であり、メモリに格納されます。つまり、メモリアドレスはa1(これは開始アドレスです)と言います。では、このメモリアドレスには何が格納されているのでしょうか。これは、以下の割り当てステートメントから得られます。

string1 = malloc(1000);

malloc-> 1000バイトのメモリのチャンクを割り当て、チャンクの開始アドレス、つまりp1を返します。

したがって、変数string1の内容はp1になります。つまり、メモリセルa1p1になります(実際には、これは単一のセルではなく、4バイト/ 8バイトの量である必要があります。ただし、簡単にするために単一のセルを想定しています)。

ここで、scanfが2番目の引数として何を期待していますか?

scanf("%s",&string1);

A valid address where it can store the input which it has accepted.

What is that in this example a1 or p1? - It is p1.

したがって、scanfの引数として&string1を指定する場合、 a1をscanfに渡していましたが、これは正しくありません。p1が正しく機能するはずなので、&string1ではなくstring1を渡す必要があります

この説明がお役に立てば幸いです。一般的にPl。以下のc-faqリンクを参照してください。これは、cの概念を理解するのに非常に役立ちます 。comp.lang.cよくある質問

于 2012-08-15T12:08:34.650 に答える
1

一般に、スレッド化はバッファリングされたストリームで奇妙な動作を引き起こす可能性がありますが、コードも誤りです。競合する引数(つまり、「%s」と)を使用して呼び出してgetNameいる署名とその内部に間違った署名があります。pthread_createscanfchar**

使用しているコンパイラが何であれ、警告レベルを高くすることを検討してください。

于 2012-08-15T12:06:36.080 に答える