- ベストアンサー
構造体の領域確保について
以下のソースでコンパイルは出来るのですが、実行時にセグメンテーション違反のエラーが出ます。 ------------------------------------------------ struct magicpacket { char mgc_syn[6]; char mgc_mac[6][12]; } mgcpkt; /* (1) */ int main(int argc, char **argv) { struct magicpacket *mgc; /* (2) */ char mac[6] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0xff }; make_magic_packet(mgc, mac); /* (3) */ } void make_magic_packet(struct magicpacket *mgc, const char *macaddr) { char *cur; int i, j; /* 初期シーケンス */ for(i = 0; i < 6; i++) { mgc->mgc_syn[i] = 0xff; } /* MAC ADDRESS部 */ cur = &mgc->mgc_mac[0][0]; for(j = 0; j < 16; j++) { memcpy(cur, macaddr, 6); cur += 6; } } ------------------------------------------------ (3)の第一引数を&mgcpkt(1)とするか、(3)の前にmgc = malloc(sizeof(struct magicpacket)); を入れると正常に動作します。(2)では正常にメモリ領域が確保されていないのでしょうか? それとも、他に原因があるのでしょうか。ご教授お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> (2)では正常にメモリ領域が確保されていないのでしょうか? (2)で確保されているのは、 "magicpacket構造体のポインタ変数" であって、"構造体の実体"がメモリ上に確保されているわけではありません。 単純に書くと、こういうことをやっています。 ---------- { char * cHoge; *cHoge = 'a'; } ---------- cHogeはどこを指しているか解らないポインタです。 ということは*cHogeに値を代入すると、どこに格納されるか解りません。
その他の回答 (1)
- liar_adan
- ベストアンサー率48% (730/1515)
>(2)では正常にメモリ領域が確保されていないのでしょうか? その通りです。 「正常に」といいますが、メモリ確保自体がされていません。 (2)では、ポインタ変数を確保しただけです。 ポインタというのは、変数の番地が書いてある紙みたいなものです。 変数そのものではありません。
お礼
(2)ではポインタ変数を確保しただけであって、 ポインタ変数にアドレスが代入されているわけでは ありませんね。ご回答ありがとうございました。
お礼
早速のご回答ありがとうございます。 上記の例非常にわかりやすいです。 確かにmagicpacket構造体のポインタ変数を宣言しただけであり、 実体が確保されたわけではありませんね。勉強になりました!