2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct ll
{
    char data[50];
    struct ll *next;
    struct ll *prev;
};
typedef struct ll node;

main()
{
    node *head;node *temp1;node *temp2;
    head = (node *)malloc(sizeof(node));
    temp1 = head;
    FILE *p;
    int n;
    char s[50];
    p = fopen("studentRecords.txt","r");
    while((fscanf(p, "%s", s)) != EOF)
    {
        strcpy(head->data, s);
        head->next = (node *)malloc(sizeof(node));
        head->next = head->next->prev;
        head = head->next;
    }
    head = NULL;
    fclose(p);
    for(temp2 = temp1; temp2->next != NULL; temp2 = temp2->next)
        printf("%s\n", temp2->data);
}

上記のコードを実行すると、出力はセグメンテーション違反です。これを修正するにはどうすればよいですか? 私は学生の記録を文字列としてstudentRecords.txtファイルに持っています。

4

4 に答える 4

0

主な問題は、次のステートメントです head->next = head->next->prev;head->next->prevは初期化されていないため、次のステートメントでに割り当てると、head->next有用なものは何も指しません。後でこの値を逆参照しようとすると、プログラムがクラッシュします。あなたがおそらく意味していたのはhead->next->prev = head;.

とはいえ、コードには他にもコメントする価値のあることがたくさんあります。

  1. int main(void)の代わりに使用しmain()ます。
  2. 戻り値を C にキャストしないでくださいmalloc。これは不要であり、エラーを隠すことができます。
  3. と の戻り値を確認してmallocくださいfopen
  4. fscanfデータの読み取りに使用する場合、%s指定子は空白が検出されるまで (最初の空白をスキップした後) のみを読み取ることに注意してください。これは、必要な場合とそうでない場合があります。また、バッファ オーバーフローを防ぐために、大量のデータを読み取らないようにする必要がある%sため、常に最大フィールド幅、つまり%49s. fgetsそして、sscanf通常はより良い方法です。
  5. free()動的に割り当てられたメモリを忘れないでください。
于 2012-08-20T17:59:33.090 に答える
0
head->next = head->next->prev;

これは正しくありません。head->next->prevはメモリの「神さえ知っている」ブロックを指し、それを に割り当てますhead->next

有用なメッセージを破棄し、head->nextゴミとして置き換えます。

于 2012-08-20T17:49:42.983 に答える