引发了异常: 写入访问权限冲突。 stu->time 是 nullptr。?

时间:2021-05-26 15:20:28
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include "myhead.h"

//**********双向链表*************
struct LStu_date* Link_list(void)
{
int num=1;
time_t t;
struct tm* now_time;//取时间
struct LStu_date* p, *stu, *tail, *head;
p = head = (struct LStu_date*) malloc(sizeof(struct LStu_date));
memset(head, 0, sizeof(struct LStu_date));
head->pfront = head->pback = head;
strcpy(head->name, "The head");
do 
{
tail=stu = (struct LStu_date*)malloc(sizeof(struct LStu_date));
memset(stu, 0, sizeof(struct LStu_date));
//memset(stu->time, 0, sizeof(struct arr_time));

stu->num = num++;
scanf_s("%s", stu->name,256);

time(&t);
now_time = localtime(&t);
stu->time->hour = now_time->tm_hour;
stu->time->min = now_time->tm_min;
stu->time->sec = now_time->tm_sec;

p->pback = stu;
stu->pfront = p;
p = stu;
head->pfront = tail;
tail->pback = head;
} while (strcmpi(p->name,"exit"));
return head;
}

//***********二叉树************
struct Treedate* CreatNode(struct LStu_date *head)
{
struct Treedate* p;
p = (struct Treedate*)malloc(sizeof(struct Treedate));
p->pleftChild = p->pRightChild = NULL;
p->num = head->num;
strcpy(p->name , head->name);
p->time->hour = head->time->hour;
p->time->min = head->time->min;
p->time->sec = head->time->sec;
return p;
}

//二叉树的遍历
void TraverTree(struct Treedate* pNode)
{
if (pNode->pleftChild!=NULL)
{
TraverTree(pNode->pleftChild);
}
printf("No.%d:%s arrived at school time is %d:%d:%d\n", pNode->num, pNode->name, pNode->time->hour, pNode->time->min, pNode->time->sec);
if (pNode->pRightChild!=NULL)
{
TraverTree(pNode->pRightChild);
}
}

struct LStu_date* AddNode(struct LStu_date* pList,struct Treedate* Root)
{
//situation one :pList->name==Root->name
if (strcmp(pList->name,Root->name)==0)
{
return pList->pback;
}
//situation two:pList->name>Root->name
if (strcmp(pList->name,Root->name)>0)
{
Root->pleftChild = CreatNode(pList);
return pList->pback;
}
//situation three: pList->name<Root->name
if (strcmp(pList->name, Root->name)<0)
{
Root->pleftChild = CreatNode(pList);
return pList->pback;
}
return pList->pback;
}
int main(int argn,char* argv[])
{
//双向链表的数据记录
struct LStu_date* head, *p;
head = Link_list();
p = head->pback;
struct Treedate* TreeRoot;
if (strcmpi(p->name, "exit")==0)
{
return 0;
}
else
{
TreeRoot = CreatNode(p);
}
p = p->pback;
while (strcmpi(p->name,"exit"))
{
p = AddNode(p,TreeRoot);
}

TraverTree(TreeRoot);
system("pause");
return 0;
}

为什么会出现这样的错误:引发了异常: 写入访问权限冲突。
                                                 stu->time 是 nullptr。

显示“无法读取内训”

3 个解决方案

#1


没有你的myhead.h无法帮你调试
贴一下你的struct LStu_date里的time
看看是不是需要分配空间
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#2


myhead.h
下面的头文件
#pragma once
struct arr_time
{
int hour;
int min;
int sec;
};

struct Treedate//二叉树学生信息结构体
{
int num;//学号
char name[256];//姓名
struct arr_time * time;
struct Treedate* pleftChild;
struct Treedate* pRightChild;
};

struct LStu_date//双向链表学生信息结构体
{
int num;//学号
char name[256];//姓名
struct arr_time * time;
struct  LStu_date* pfront;//向前
struct  LStu_date* pback;//向后
};

#3


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止

#1


没有你的myhead.h无法帮你调试
贴一下你的struct LStu_date里的time
看看是不是需要分配空间
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#2


myhead.h
下面的头文件
#pragma once
struct arr_time
{
int hour;
int min;
int sec;
};

struct Treedate//二叉树学生信息结构体
{
int num;//学号
char name[256];//姓名
struct arr_time * time;
struct Treedate* pleftChild;
struct Treedate* pRightChild;
};

struct LStu_date//双向链表学生信息结构体
{
int num;//学号
char name[256];//姓名
struct arr_time * time;
struct  LStu_date* pfront;//向前
struct  LStu_date* pback;//向后
};

#3


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止