プロが教えるわが家の防犯対策術!

以下のソースでコンパイルは出来るのですが、実行時にセグメンテーション違反のエラーが出ます。
------------------------------------------------
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)では正常にメモリ領域が確保されていないのでしょうか?
それとも、他に原因があるのでしょうか。ご教授お願いします。

A 回答 (2件)

> (2)では正常にメモリ領域が確保されていないのでしょうか?



(2)で確保されているのは、
"magicpacket構造体のポインタ変数"
であって、"構造体の実体"がメモリ上に確保されているわけではありません。
単純に書くと、こういうことをやっています。

----------
{
char * cHoge;
*cHoge = 'a';
}
----------
cHogeはどこを指しているか解らないポインタです。
ということは*cHogeに値を代入すると、どこに格納されるか解りません。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
上記の例非常にわかりやすいです。
確かにmagicpacket構造体のポインタ変数を宣言しただけであり、
実体が確保されたわけではありませんね。勉強になりました!

お礼日時:2003/07/07 17:20

>(2)では正常にメモリ領域が確保されていないのでしょうか?



その通りです。
「正常に」といいますが、メモリ確保自体がされていません。

(2)では、ポインタ変数を確保しただけです。
ポインタというのは、変数の番地が書いてある紙みたいなものです。
変数そのものではありません。
    • good
    • 0
この回答へのお礼

(2)ではポインタ変数を確保しただけであって、
ポインタ変数にアドレスが代入されているわけでは
ありませんね。ご回答ありがとうございました。

お礼日時:2003/07/07 17:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!