C fread上的访问冲突错误

C fread上的访问冲突错误,c,C,这是部分代码: typedef struct { int dd, mm, yy; } dateType; typedef struct { char username[50], password[50]; int acctype; dateType date; } usertype; typedef struct { float transactions; char use[50]; dateType date; } transacty

这是部分代码:

typedef struct {
    int dd, mm, yy;
} dateType;

typedef struct {
    char username[50], password[50];
    int acctype;
    dateType date;
} usertype;

typedef struct {
    float transactions;
    char use[50];
    dateType date;
} transactype;

typedef struct node {
    usertype employee[2];
    usertype admin;
    transactype trans[3];
    float funds;
    int department;
    struct node *next;
} nd;

void logon(nd **);
void admin_reg(nd **);

void main(void)
{
    int choice;
    nd *head, *p;

    do {
        printf("MENU:\n");
        printf("1.Log In\n");
        printf("2.Admin/Manager Registration\n");
        printf("3.Exit\n");
        printf("Enter your choice:");
        scanf("%d",&choice);

        switch(choice)
        {
            case 1:
                logon(&head);
                clrscr();
            break;
            case 2:
                admin_reg(&head);
                clrscr();
            break;
            case 3:
                exit(1);
            break;
            default:
                printf("Invalid choice.\n");
            break;
        }
    }while(choice!=3);
}

void admin_reg(nd **head)
{
    int i;
    nd *p;
    FILE *fp;

    if((fp=fopen("Admin.txt","w"))==NULL)
    {
        printf("file not found");
        exit(1);
    }

    *head = (nd*)malloc(sizeof(nd));
    printf("admin username: ");
    scanf("%s",(*head)->admin.username);
    printf("admin password: ");
    scanf("%s",(*head)->admin.password);
    printf("Admin department:1 2 3: ");
    scanf("%d",&(*head)->department);
    (*head)->admin.acctype=3;
    fwrite(*head, sizeof(nd), 1, fp);

    p = *head;

    for(i = 2; i <= 3; i++)
    {
        p->next = (nd*)malloc(sizeof(nd));
        printf("admin username: ");
        scanf("%s",p->next->admin.username);
        printf("admin password: ");
        scanf("%s",p->next->admin.password);
        printf("Admin department:1 2 3: ");
        scanf("%d",&p->next->department);
        p->next->admin.acctype=3;
        fwrite(p->next,sizeof(nd),1,fp);
        p = p->next;
    }
    p->next = NULL;

    fclose(fp);
}

void logon(nd **head)
{
    nd *p;
    char username[50], password[50];
    p=*head;
    FILE *fp;

    if((fp=fopen("Admin.txt","r"))==NULL)
    {
        printf("file not found");
        exit(1);
    }

    printf("Input username:");
    scanf("%s",username);
    printf("Input password:");
    scanf("%s",password);

    while(fread(p, sizeof(nd), 1, fp)==1)
    {  
        if(strcmp(p->admin.username,username)==0 && strcmp(p->admin.password,password)==0)
        {
            puts(p->admin.username);
            puts(p->admin.password);
            printf("\nSuccessfully compared!");getch();
        }
        /* else
        {
            for(x=0;x<2;x++)
                if(strcmp(username,p->employee[x].username)==0 && strcmp(password,p->employee[x].password)==0)
                {
                    y++;
                }
        } */

        p=p->next;
    }

    fclose(fp);getch();
}
typedef结构{
年月日;
}日期类型;
类型定义结构{
字符用户名[50],密码[50];
int acctype;
日期类型日期;
}用户类型;
类型定义结构{
浮动交易;
字符使用[50];
日期类型日期;
}交易类型;
类型定义结构节点{
用户类型employee[2];
用户类型管理;
trans型[3];
流动资金;
国际部;
结构节点*下一步;
}钕;
无效登录(nd**);
无效管理员注册(nd**);
真空总管(真空)
{
智力选择;
nd*头,*p;
做{
printf(“菜单:\n”);
printf(“1.Log-In\n”);
printf(“2.Admin/Manager注册”);
printf(“3.退出\n”);
printf(“输入您的选择:”);
scanf(“%d”,选择(&C);
开关(选择)
{
案例1:
登录(&head);
clrsc();
打破
案例2:
管理员注册(&head);
clrsc();
打破
案例3:
出口(1);
打破
违约:
printf(“无效选择。\n”);
打破
}
}while(选项!=3);
}
无效管理员登记(nd**head)
{
int i;
nd*p;
文件*fp;
if((fp=fopen(“Admin.txt”,“w”))==NULL)
{
printf(“未找到文件”);
出口(1);
}
*头=(nd*)马洛克(sizeof(nd));
printf(“管理员用户名:”);
scanf(“%s”,(*head)->管理员用户名);
printf(“管理员密码:”);
scanf(“%s”,(*head)->管理员密码);
printf(“行政部门:1 2 3:”);
scanf(“%d”和(*负责人)->部门);
(*head)->admin.acctype=3;
fwrite(*头部,尺寸(nd),1,fp);
p=*头;
对于(i=2;i next=(nd*)malloc(sizeof(nd));
printf(“管理员用户名:”);
scanf(“%s”,p->next->admin.username);
printf(“管理员密码:”);
scanf(“%s”,p->next->admin.password);
printf(“行政部门:1 2 3:”);
scanf(“%d”,&p->next->department);
p->next->admin.acctype=3;
fwrite(p->next,sizeof(nd),1,fp);
p=p->next;
}
p->next=NULL;
fclose(fp);
}
无效登录(nd**head)
{
nd*p;
字符用户名[50],密码[50];
p=*头;
文件*fp;
if((fp=fopen(“Admin.txt”,“r”))==NULL)
{
printf(“未找到文件”);
出口(1);
}
printf(“输入用户名:”);
scanf(“%s”,用户名);
printf(“输入密码:”);
scanf(“%s”,密码);
而(fread(p,sizeof(nd),1,fp)==1)
{  
if(strcmp(p->admin.username,username)==0&&strcmp(p->admin.password,password)==0)
{
放置(p->admin.username);
放置(p->admin.password);
printf(“\n比较成功!”);getch();
}
/*否则
{
对于(x=0;x员工[x]。用户名)==0&&strcmp(密码,p->员工[x]。密码)==0)
{
y++;
}
} */
p=p->next;
}
fclose(fp);getch();
}
我在fread部分出错,fwrite很好。当我试图检查第二个或第三个帐户是否可以检索时,整个程序只是停止,第一个帐户似乎可以,第二个和第三个帐户则不行


编辑:谢谢你们的回答,我终于找到了问题的根源,你们都帮了我很大的忙。谢谢你的建议。:)

您将
fread
添加到
p
中,但从不为其分配内存,或者将
p
更改为

nd p;
并将
&p
作为第一个参数传递给
fread
,或
malloc
内存:

nd * p = malloc(sizeof(nd));

编辑:我看到您分配了
p=*headlogon
中输入code>并从
main
中输入
head
,因此
logon
中的代码应该可以工作,但
head
未在
main
中分配。因此,将
nd*head
更改为
nd-head
malloc
它。

不要使用
void main
main
必须声明为
int
。另外,不要强制转换
malloc
的结果。您很可能正在重写内存中的某些内容。没有人会费力地阅读代码。如果您不知道如何使用调试器,我首先建议您熟悉IDE并使用调试器逐步完成代码。由于
c98标准
,'void main'是一个错误。或者
c99
。感谢您的帮助,虽然我可能应该声明我使用的是旧编译器,因此不强制转换malloc会给我带来错误,但我确实尝试将void main更改为int main,但这并没有缓解问题:(.感谢您的回复:),错误只发生在登录函数期间,当我尝试使用应该创建并存储在文件中的第二个或第三个帐户登录时。fread似乎收回了第一笔罚款,第二笔和第三笔。。没有那么多。所以我不应该使用p=*head;?head已通过,并且已经分配了内存,我将尝试您的建议,谢谢:)