2012-03-05 16 views
-1

ポインタ割り当ての直後に関数が呼び出されたときに、セグメンテーション違反が発生しました。ポインタ割り当ての後にセグメンテーションエラーが発生するのはなぜですか?

typedef struct 
{ 
    DMINT field1; 
    DMINT field2; 
    DMINT field3; 
} MSG1; 

typedef struct 
{ 
.... 
} MSG; 

/* MSG is size of 1040 byte, bigger than MSG1 in size */ 

int main() 
{ 
    MSG  Msg; 
    MSG1 *pMsg1; 
    int  mid; 
    pthread_t tid; 
    ... 

    Recv_msg(mid, &Msg); /* this function does a memcpy to &Msg */ 
    pMsg1 = (MSG1 *)&Msg; 

    //ret = pthread_join(pMsg1->.....); /* Got Segmentation fault here by GDB*/ 
    /* even the first argument has nothing to do with pMsg1, SEGV is still received */ 
    ret = pthread_creat(&tid, NULL, thread_function, NULL); /* Got Segmentation fault here by GDB*/ 

pMsg1 = (MSG1 *)&Msgを削除しても問題ありません。 2つのポインタのサイズが異なるためですか?

ありがとうございました。

+4

もう少し情報を提供する必要があります。例: 'Recv_msg'では何をしていますか?ソースコードをお願いします。 – Constantinius

+0

はもっと多くのコードを表示します。逆参照されると、構造体内のポインタを含むすべてのポインタが初期化され、確実にNULLにならないようにしてください。 'valgrind'を使ってメモリリークのバグを追跡することも考えてください。 –

+0

これを診断し始めても、他の人にはもっと多くの情報が必要です。 – tbert

答えて

2

あなたが安全に1つの構造体は、他のの初めに産む場合にのみ、別のに1つの構造体のポインタを変換することができます(CのSTDを参照してください、彼らはどんなにサイズ。):

typedef struct { 
    int a; 
} S1; 
typedef struct { 
    S1 s1; // <- s1 it the FIRST structure field 
    int b; 
} S2; 
S2 s2; 
S1 *s1; 
s1= (S1*)&s2; // <- safe 

そうでない場合は、あなたがに得ることができます問題と未定義の振る舞いを調整します。

0

MSG1およびMSGは、異なるタイプです。

pMsg1は、タイプMSGMsgを指していますが、タイプはMSG1*です。

MSG1のフィールドにアクセスしようとすると、MSGがあるメモリ領域では未定義の動作が発生します。

+0

なぜセグメンテーションが起こるのでしょうか?それでも有効なポインタアドレスです。 –

+1

'pthread_join'がそのアドレスで見つけたデータを理解しようとするので、segfaultが発生しますが、それはナンセンスです。 –

+0

それはポインタの割り当てにsegfaultingしていません。 pthread_join()の呼び出しで 'pMsg1->'にアクセスしたときのsegfaulting – aidanok

0

構造が同一でない場合は、

pMsg1 = (MSG1 *)&Msg; 

を割り当てることにより、コピーしないでくださいは、構造体の個々の要素をコピーします。その後、それはあなたの問題を解決します。

関連する問題