c言語/gcc/Linux
自己参照的構造体をprintf文で出力する関数を再帰的関数として作りたいのですが、何度やってもセグメンテーションエラーになってしまいます。
http://codepad.org/yhMQB6vC
ソースコードは上記のサイトに載せておきますのでそちらを参照ください。
void free_sts()はソースコードにありませんが、単純にメモリ領域の解放をするだけなので、載せていないことに意味もないので(じゃあ載せろよって思わないでw)、気にしないでください。
説明不足な点がありましたら補足します。
よろしくお願いします。
自己参照構造体について
Re: 自己参照構造体について
セグメンテーションエラーは調べれば分かりますが、
基本的にメモリの不正な箇所にアクセスすると起こるエラーです。
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を宣言し、リスト構造を表現しているのですから、
これを渡すべきです。むしろ、そうでないと自己参照構造体の意味がないのでは?
基本的にメモリの不正な箇所にアクセスすると起こるエラーです。
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を宣言し、リスト構造を表現しているのですから、
これを渡すべきです。むしろ、そうでないと自己参照構造体の意味がないのでは?
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 自己参照構造体について
_で初めてないから特に問題はないんじゃないですか?naohiro19 さんが書きました:[迷信] 構造体のタグ名は下線で始めるを参照してください。