2

Segmentation Fault初期化されていないメモリにアクセスしている場所がわからないので、次のコードを取得しています。コードをデバッグしようとしましたが、このセグメンテーション違反は*gスレッド内のプロシージャと関係があることがわかりました。コードは次のとおりです。

void *Func(void *arg);

int main()
{
    pthread_t tid;
    void *x;

    pthread_create(&tid,NULL,Func,NULL);
    pthread_join(tid,&x);
    int i=*(int *)x;
    printf("Data returned from the thread %d\n",i);

    return 0;
}

void *Func(void *arg)
{
    int *g;
    int i=2,j=3;
    printf("inside thread\n");      
    *g=i+j;
    printf("%d\n",*g);

    return g;
}
4

3 に答える 3

3

問題は以下のコードにあります

int *g;
....
*g=i+j;

g初期化されていないポインタです。逆参照すると、メモリ内の未定義の場所に書き込もうとします。この影響は定義されていませんが、セグメンテーション違反の可能性が非常に高くなります。

これに対処する方法はいくつかあります。

  • にメモリを割り当てるg
  • g割り当てられたメモリを指す
  • スタックで宣言gし、そのスタックmainへのポインタを子スレッドに渡します
于 2012-12-14T10:34:07.997 に答える
2

gは、int *g; 割り当てられていない場所のアドレスであり、その場所に割り当てようとしています。

このようにしてください:

int *g=calloc(1, sizeof(int)) ;

freeまた、記憶することを忘れないでください。

于 2012-12-14T10:35:02.773 に答える
1

あなたがやっている:

int *g;
...
*g=i+j;

gは初期化されていないポインタであり、それが指している場所に書き込もうとしているため、未定義の動作が発生します。

于 2012-12-14T10:35:23.303 に答える