2016-09-21 22 views
-1

構造体メンバが別の構造体を指しているときにセグメンテーション違反が発生します。私がポイントにしたい構造がir_socket_t socket;である一方、詳細には、私の新しい構造が他の構造体を指す構造体ポインタメンバがセグメンテーションフォールト(C/C++)

typedef struct _sock_t{ 
    ir_socket_t *_socket; 
    bool flag; 
    extern_class obj; 
    double *vect; 
}; 

です。 main()で、私が何かをしたら、

_sock_t *_sock ; 
    _sock->_socket = &socket; 

私はセグメント違反を取得します。ただし、

_sock_t _sock ; 
    _sock._socket = &socket; 

が問題ありません。最初のアプローチについて何が間違っていますか?

P.S. ir_socket_tはCのC++構造ではないことに注意してください。


UPDATE: 私はまた、新しい構造体としてC++クラスのオブジェクトを考慮すれば、後者のアプローチには問題(なしポインタはありませんが、私はまだ

int n(4); 
_sock->obj.resize(4); // here segmentation fault 

でセグメンテーションフォールトを取得)。私がしてもこれは起こる_sock_t *_sock = (_sock_t *)malloc(sizeof(_sock_t));; @ Bathshebba答えを使用して。

どうすれば問題ありますか?

_sock->vect= new double[n]が問題なく動作することに注意してください。

代わりに_sock = new _sock_t;が正常に機能することにも注意してください。

+1

あなたは '_sock'を初期化していません。 – juanchopanza

+0

'_sock_t * _sock'。 Cプログラミングでさらに進める前に、ポインタについて学ぶ方がよいでしょう。これは、元に戻されていないポインタです。もちろん、逆参照することはできません。 – kaylum

+1

変数 '_sock'は、有効な(適切に割り当てられた)メモリブロックを指すように初期化されていません。 –

答えて

2

これはほとんど驚くべきことではありません。書面では、_sock_t *_sockは、ポインタを宣言するだけです。

しかし、ポイントには何もありません。 の逆参照(あなたの場合は、メンバーオペレーター->へのポインター経由での振る舞い)は、未定義です。

割り当てられたメモリをポイントする必要があります。これはCではmalloc、C++ではnewを使用してください。一度ポインタを入力すると、それぞれfreedeleteに電話することを忘れないでください。さもなければ、のリークメモリになります。

最後に、(acknowledge @ Karthick)、CコードをコンパイルするためにC++コンパイラを使用しているようです.Cでは、struct _sock_t *_sock;と書く必要があります。

+0

単語 "タイプ"は冗長なIMOです。 –

+0

@barakmanos:はい、あなたは正しいと思います。それはそれなしではより良く読む。 – Bathsheba

+0

すでに '_sock_t * _sock = NULL'を試しましたが、成功しませんでした。 '_sock_t * _sock = malloc(sizeof(_sock_t));'を試してください。 – Courier