一个关于c语言编译时出现的访问冲突问题。

图片说明
----------这是控制台到这里就无法继续执行下去了。
图片说明

------------以下是源码

#include
#include
#define N 30

struct recipe{
char food[10];
float price;
struct recipe *next;

};

struct recipe* creat()
{ int x;
int i=0;
struct recipe *head,*p,*tail;
head=tail=NULL;
printf("请输入新添加的菜品数量:");
scanf("%d",&x);
for(i=0;i<x;i++){
p=(struct recipe *)malloc(sizeof(struct recipe));
if(p==NULL)
{ printf("分配内存失败.");
exit(1);
}

printf("请输入菜品的名称:");
scanf("%s",p->food);
printf("请输入菜品价格:");
scanf("%f",p->price);
p->next=NULL;
if(head==NULL)
{   
    head=tail=p;
}
else
{  tail->next=p;
   tail=p;
}
}
return head;

}

void choosemenu(){

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[1]输入新的菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[2]查看现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[3]修改现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[4]查找现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[5]删除现有菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[6]保存修改菜品信息\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦[7]退出菜品信息管理系统\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

printf("\t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦请选择:     \t♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦\n");

}

void choice(){

/*switch(n){
case  '1':inputInformation();
         break;
case  '2':showInformation();
    break;
case  '3':changeInformation();
    break;
case  '4':searchInformation();
    break;
case  '5':deleteInformation();
    break;
case  '6':saveInformation();
    break;
case  '7':printf("Thanks for your use!\n\n\n\n");
    break;
default:choosemenu();
    printf("输入有误,请重新输入.\n");

}*/

}

void main(){
int n;

struct recipe *head=NULL;

printf("--------------------欢迎进入订餐管理系统--------------------------\n");
printf("-------首次进入请确认你已写好菜品信息--------\n");
head=creat();
choosemenu();
while(n!=7){

    scanf("%c",&n);
    choice();
}



system("pause");

}

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#define N 30
struct recipe {
char food[10];
float price;
struct recipe next;
};
struct recipe
creat()
{
int x;
int i = 0;
struct recipe *head, *p, *tail;
head = tail = NULL;
printf("请输入新添加的菜品数量:");
scanf("%d", &x);
for (i = 0; i p = (struct recipe *)malloc(sizeof(struct recipe));
if (p == NULL)
{
printf("分配内存失败.");
exit(1);
}
printf("请输入菜品的名称:");
scanf("%s", p->food);
printf("请输入菜品价格:");
scanf("%f", &p->price);
p->next = NULL;
if (head == NULL)
{
head = tail = p;
}
else
{
tail->next = p;
tail = p;
}
}
return head;
}
void choosemenu() {
printf("\t?????????????????????[1]输入新的菜品信息\t?????????????????????\n");

printf("\t?????????????????????[2]查看现有菜品信息\t?????????????????????\n");

printf("\t?????????????????????[3]修改现有菜品信息\t?????????????????????\n");

printf("\t?????????????????????[4]查找现有菜品信息\t?????????????????????\n");

printf("\t?????????????????????[5]删除现有菜品信息\t?????????????????????\n");

printf("\t?????????????????????[6]保存修改菜品信息\t?????????????????????\n");

printf("\t?????????????????????[7]退出菜品信息管理系统\t?????????????????????\n");

printf("\t?????????????????????请选择:     \t?????????????????????\n");

}
void choice(int n) {
/*switch(n){
case '1':inputInformation();
break;
case '2':showInformation();
break;
case '3':changeInformation();
break;
case '4':searchInformation();
break;
case '5':deleteInformation();
break;
case '6':saveInformation();
break;
case '7':printf("Thanks for your use!\n\n\n\n");
break;
default:choosemenu();
printf("输入有误,请重新输入.\n");

}*/

}
void main() {
int n;
struct recipe *head = NULL;

printf("--------------------欢迎进入订餐管理系统--------------------------\n");
printf("-------首次进入请确认你已写好菜品信息--------\n");
head = creat();
choosemenu();
while ((scanf("%d", &n))==1&&n != 7) {
    choice(n);
}



system("pause");

}

很明显,非法访问值为NULL的指针,调试一下看看那个变量为NULL,在没有赋值前你使用了

看一下函数说明:
int scanf ( Forma [, Pointer, ... ])
楼上说的对,p->price是一个float,不是一个指针,而scanf第二个参数必须是指针,可以加一个&来取地址:&p->price。
你的代码struct recipe creat(),在循环中的scanf,运行到读取价格的scanf时,输入价格后将值写入price指向的地址,因为不是一个合法的地址(实际地址可以看做为浮点数28),就报错了。