編集:Dijkstraの答えがこの問題を修正する方法です。私のリストはNULLに初期化されていませんでしたリンクリストのセグメンテーションフォルト
私はリストをトラバースしようとすると、segfaultsの単語の一意のリストを格納するためにリンクリストに取り組んでいます。 GDBは私を与える:
Program received signal SIGSEGV,
Segmentation fault. 0x0000003a07e47ff7 in vfprintf() from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6_0.5.x86_64
リストのための挿入コードは次のとおりです。
typedef struct L { char x[40] ; int occ; struct L *next ;} List;
List *insertList(char *in, List *l)
{
List *t = calloc(1, sizeof(List)) ;
strcpy(t->x, in);
t->occ = 1;
t->next = l ;
return t ;
}
void printList(List *l)
{
List *l2 = l;
while(l2)
{
printf("%s ", l2->x);
l2 = l2->next;
}
return;
}
その一見罰金、リンクリストにそれらを挿入し、言葉をループ。リストをループして(約4200語の)単語を表示すると、約98%のishがうまく表示され、警告なしでセグメンテーションされます。
検査をもう少しすると、追加されたのと反対の順序で単語が読み込まれ(意味があります)、segfaultingする前にリストの最後から5番目の単語(5番目の単語が追加されます)に到達します。私は文字列の長さが40文字以上になるように挿入関数を調整しようとしましたが、最初に挿入される単語(およびsegfaulted)はすべて20文字未満です。
printList関数でl2-> next-> next-> next-> nextfをprintfすれば、最初に挿入された単語がそこにあります。
誰も私にこの方向性を向けることができますか?何かがどこか後半リスト内のポインタ、および長すぎる「の」文字列あなたの「次へ」を上書きしているよう
リストを印刷するためのコードを入力してください。 – nmjohn
まず、 'strcpy'の代わりに' strncpy'を使う習慣を覚えてください。 – thiton
39文字より長い単語の1つですか? 'strncpy'を使ってメモリをオーバーランさせないようにしてください。 – ugoren