结构体里面包含结构体变量,用scanf赋值

int main()
{

typedef struct datetime
{
char year[10];
char month[10];
char day[10];
char hours[10];
char minutes[10];
}datetime;

typedef struct Student
{
    char Stu_Id[20];
    char Stu_Name[10];
    char Stu_Sex[10];
    char Dor_Id[10];
    datetime Stu_Enr[10];
    datetime Stu_Birth[10];
    char Stu_Study[10];
    char Stu_Class[10];
    char Stu_Polit[10];
    char Stu_Add[50];
    char Stu_Tel[10];
    char Stu_Sta[10];
    char Stu_Des[50];
}Student;


Student *p;
scanf("%s",p->Stu_Enr->year);
printf("%s",p->Stu_Enr->year);

}


这样的话输入字符,按回车后程序会崩溃

问题不在结构体吧,Student* p 未初始化呀,应该 Student * p = new Student;

Student* p 未分配内存

不知道你用的什么编译器,这个错误应该编译不过去,是指针没有初始化,有两种改法:
Student *p =new Student;

Student p = (Student)malloc(sizeof(Student));
第一种不行的话 可以用第二种

Student* p 未初始化

没有给p指针分配相应的内存

Student* p是空指针。初始化该指针,通过new或malloc

结构体是空指针,要创建(new或malloc)一个新指针

首先你得明白malloc函数的作用;malloc函数是在内存中找到一个合适大小的内存空间来存储数据,并让指针指向这个空间的首地址。它的意义是在创建数组时,可以创建动态数组。
比如 int a[n],*p;p=a;是不合法的。而int *p;p=(int *)malloc(n*sizeof(int))却可以实现创建这样一个长度为n的数组

p是一个空指针,没有办法赋值的,直接Student p

student *p没有分配内存

p是一个空指针,没有办法赋值的,直接Student p,student *p没有分配内存

p初始时是一个野指针,其指向可以说是任意的,如果直接引用可能会越界访问内存,而自然,一个程序必然有它在内存中的一定的段,越界访问是不被允许,于是它就崩溃了呗。

*p 是一个空指针;