2016-11-28 11 views
-1

私はコンパイラの警告とセグメンテーションフォールトを得る理由はわかりません。警告:poiterキャストへのwint

チェックアウトできますか?

struct thread_data{ 
    int thread_id; 
    char *message; 
}; 


void *print_message_function(void *ptr) 
{  
    int s,j; 
    char *line; 
    line = (char *) ptr; 
    s=sizeof(line); 
    struct thread_data td[s]; 

    printf("%s \n",line[2]); 

    for(j=0;j+3<s;j++) { 
     td[j].thread_id = (int)line[j+3]; 
     td[j].message = (char *)line[j+1]; 
     printf("message : %s \n ",td[j].message); 
    } 
} 

答えて

0

いくつか悪い事があります。

  1. はなぜあなたがvoid *引数を受け取り、それをキャストしているが、なぜ引数としてのchar *ラインを受け入れていませんか?
  2. なぜstrlenの代わりにsizeofを使用していますか? sizeof行はちょうどポインタのサイズ(私は思う4バイト)です。
  3. これは:struct thread_data td[s]は非常に悪いです。未知数の配列を静的に割り当てることはできません。あなたのケースでは、あなたが間違い2をしたことで知られていますが、私はコンパイラが知っているかどうかは分かりません。 mallocを使用してください。
  4. line[2]は、なぜ%sで、%cを使用していませんか?これはおそらく警告/セグメンテーション違反の原因になります。あなたがそこに持っている文字をポインタとして使用し、不正なメモリにアクセスしています。
  5. ループは、Cのチュートリアルをお読みください一度なぜなら2.

で実行されます。

+0

特別感謝:))):))))))))) –

+0

@ElhamKargar - あなたの質問を解決するのに役立つ答えを(左の投票ボタンの下のチェックマーク)を忘れないでください。 – Tony

関連する問題