0

これは、バイナリ経由で読み込んだ情報を含む私の学生の構造体です

   typedef struct student_t {

     //data in here

     } student_t;

これは私がそれらをメインで宣言した方法です

double_linkedlist_t* listPtr;
student_t students;
node_t* node = NULLL;

これが私のファイルの初期化方法です

FILE *file;
printf("What file would you like to select?\n");
fgets( filename, MAX_NAME_LENGTH, stdin );
strtok(filename, "\n");
fflush(stdin);
file = fopen(filename, "rb+wb");

これは、私の fwrite がメインでどのように見えるかです。セグメンテーション違反が発生し続け、二重リンク リストをバイナリ ファイルに書き込む方法について私が見たすべての例では、これを行う必要があります。だから私はここに来て、なぜ私が持っているものに何らかの変更を加えたのかを説明します. また、main で listPtr として宣言された二重リンク リストと、node としてのノードがあります。

これは私のイニシャルです

     node_t* Init_Node( student_t data ) 
     {
       node_t* node = (node_t*) malloc( sizeof( node_t ) );
       node -> students = data;
       node->nextPtr = NULL; 
       node->prevPtr = NULL;
       return node;
     }

これは nodeinit のプロトタイプと一緒に私のノード構造体です

     typedef struct node_t
     {
       student_t students;
       struct node_t* nextPtr;
       struct node_t* prevPtr;
      } node_t;

     //prototypes
     node_t* Init_Node( student_t );


            node = listPtr->headPtr; //segmentation faults here
            while(node!=NULL)
            {
                fwrite(node, sizeof(student_t), 1, file);
                node=node->nextPtr; 
            }

なぜこれが起こっているのかについての助けをいただければ幸いです。二重にリンクされたリストを含むバイナリファイルに実際に書き込んだことはありません:/.

4

1 に答える 1

1

より完全なコードを示していないため、推測することしかできませんが、問題は次のとおりです。

double_linkedlist_t* listPtr;

これはmain関数内で宣言されたローカル変数のようですが、これの問題は、関数内のローカル変数が初期化されていないことです。したがって、宣言を行い、ポインタが実際にどこかを指さないようにすることで、一見ランダムな場所を指します。

初期化されていないローカル (非静的) 変数は不確定な値を持ち、有効な場所を指さずにポインターを逆参照すると、クラッシュの非常に一般的な原因である未定義の動作が発生します。

考えられる解決策は 2 つあります。

  1. メモリを割り当て、ポインタがそれを指すようにします。

    double_linkedlist_t* listPtr = malloc(sizeof *listPtr);
    
  2. そもそもポインターとして宣言しないでください。ポインターが必要な場合は、アドレス取得演算子を使用&して取得します。

    double_linkedlist_t list;
    list.headPtr = NULL;
    list.tailPtr = NULL;
    
    ...
    
    callSomeFunction(&list);
    
于 2015-03-10T04:24:06.470 に答える