テキストファイルから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
にmalloc
それがでクラッシュしたリンクリストの次のノードmalloc
ラインと私が言うエラーが表示されます。
"Windows has triggered a breakpoint in final-project.exe.
これは、ヒープの破損が原因である可能性があります。これは、ヒープfinal-project.exe
またはロードされたDLLのいずれかにバグがあることを示しています。
これは、ユーザーがフォーカスF12
をfinal-project.exe
持っているときに押したことが原因である可能性もあります。
出力ウィンドウには、より多くの診断情報が含まれている可能性があります。」
私の推測では、関数でポインターを定義した方法に何かがあると思います。
私はどんな助けにも感謝します、ありがとう!
この線
head=(SyDetails) malloc(sizeof (SyDetails));
2つの点で間違っています。まず、メモリを破損している理由:SyDetails
はポインタであるためsizeof(pointer)
、必要なバイト数よりも少ないバイトのみが割り当てられますsizeof(struct SystemDetails)
。これを変更する必要があります。さらに良いことにsizeof(*head)
、タイプがhead
変更された場合に備えて安全になるように変更してください。
2つ目は、Cでは、の戻り値をキャストしてはならないということですmalloc()
。
概して:
head = malloc(sizeof(*head));
あなたが本当に欲しいものです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加