ページ 11

自己参照構造体について

Posted: 2011年6月17日(金) 23:26
by マイ
c言語/gcc/Linux

自己参照的構造体をprintf文で出力する関数を再帰的関数として作りたいのですが、何度やってもセグメンテーションエラーになってしまいます。

http://codepad.org/yhMQB6vC

ソースコードは上記のサイトに載せておきますのでそちらを参照ください。
void free_sts()はソースコードにありませんが、単純にメモリ領域の解放をするだけなので、載せていないことに意味もないので(じゃあ載せろよって思わないでw)、気にしないでください。
説明不足な点がありましたら補足します。
よろしくお願いします。

Re: 自己参照構造体について

Posted: 2011年6月17日(金) 23:47
by naohiro19

Re: 自己参照構造体について

Posted: 2011年6月18日(土) 00:10
by MNS
セグメンテーションエラーは調べれば分かりますが、
基本的にメモリの不正な箇所にアクセスすると起こるエラーです。

void re_print_sts(struct st *s)
{
if(s != NULL){
printf("(%d, %d)\n",s->value1, s->value2);
re_print_sts(s + 1);
}
}

s+1の指す先に対するアクセスが許可されていないので、エラーが出ています。
それぞれの要素を各々で動的確保しているので、要素が連続しているなんてことは、
万が一でない限りありえません。配列とごっちゃになっているように思えます。

ここで、なぜre_print_sts(s + 1);としているのでしょうか?
わざわざ構造体のメンバでnextを宣言し、リスト構造を表現しているのですから、
これを渡すべきです。むしろ、そうでないと自己参照構造体の意味がないのでは?

Re: 自己参照構造体について

Posted: 2011年6月18日(土) 00:13
by bitter_fox
naohiro19 さんが書きました:[迷信] 構造体のタグ名は下線で始めるを参照してください。
_で初めてないから特に問題はないんじゃないですか?

Re: 自己参照構造体について

Posted: 2011年6月18日(土) 00:15
by マイ
>MNSさん
そのやり方を教えてほしいのですが。

Re: 自己参照構造体について

Posted: 2011年6月18日(土) 00:38
by box
s + 1
ではなくて、
s->next
ではないのでしょうか。