-1

テキスト ファイルから C の構造体のリンク リストに読み込もうとしています。

.hプログラムでは、次のようにファイルに構造体定義があります。

typedef struct SystemDetails *SyDetails;

構造体自体は、.cpp ファイルで次のように定義されます。

struct SystemDetails //stores system users data from the list
{
char fname[20],lname[20],password[7],email[30],SQuestion[10],SAnswer[10];
long unsigned int id;
int memory_alloc, request_ind,delete_ind;
SystemDetails *next;
};

ファイルとデータ転送を処理する関数は次のとおりです。

SyDetails System_Data()
{
FILE *fp=NULL;
SyDetails head=NULL,curr=NULL;
char fname[20],lname[20],password[7],email[30],SQuestion[10],SAnswer[10];
long unsigned int id=0;
int memory_alloc=0,request_ind=0,delete_ind=0;
fp=fopen("SystemList.txt","r+");
if(fp==NULL)//if file doesn't exist on the pc open a new file
{

    printf("error,file cant open\n");
    exit(-1);

}
else
{

    while(fscanf(fp, "%s %s %d %s %s %s %s %d %d %d", &fname,&lname,&id,&email,&password,&SQuestion,&SAnswer,&memory_alloc,&request_ind,&delete_ind)!=EOF)
    {
        if(head==NULL)
        {
            head=(SyDetails) malloc(sizeof (SyDetails));
            curr=head;
        }
        else
        {

            curr->next=(SyDetails) malloc(sizeof (SyDetails));
            curr=curr->next;
        }
        strncpy(curr->fname, fname, 20);
        strncpy(curr->lname, lname, 20);
        curr->id=id;
        strncpy(curr->email, email, 30);
        strncpy(curr->password, password, 10);
        strncpy(curr->SQuestion, SQuestion, 10);
        strncpy(curr->SAnswer, SAnswer, 10);
        curr->memory_alloc=memory_alloc;
        curr->request_ind=request_ind;
        curr->delete_ind=delete_ind;
        curr->next=NULL;

    }

}
return head;


}

とにかく、テキストファイルには3つのレコードがあり、最初の行head==NULLは機能しますが、2回目に関数がリンクリストの次のノードに到達すると、その行でクラッシュし、次elseのエラーが表示されます:mallocmalloc

"Windows has triggered a breakpoint in final-project.exe.

これは、ヒープの破損が原因である可能性があります。これは、final-project.exeロードされた DLL のバグを示しています。

これは、ユーザーがフォーカスF12を持っているときに押したことが原因である可能性もあります。final-project.exe

出力ウィンドウには、より多くの診断情報が表示される場合があります。」

私の推測では、関数でポインターを定義した方法に何かがあると思います。

私はどんな助けにも感謝します、ありがとう!

4

2 に答える 2

0

私が気づいた1つの問題は次のとおりです。

head=(SyDetails) malloc(sizeof (SyDetails));
....
curr->next=(SyDetails) malloc(sizeof (SyDetails));

そのはず:

head=(SyDetails) malloc(sizeof (struct SystemDetails));
....
curr->next=(SyDetails) malloc(sizeof (struct SystemDetails));

構造体へのポインタ (SyDetails) ではなく、構造体が占有するバイト数を割り当てたいためです。

于 2013-07-09T15:54:49.023 に答える