引发了未经处理的异常:读取访问权限冲突。 **p** 是 nullptr?

大佬们救救。

写个链式表多项式,老是填一些奇怪的错误,能帮忙看看吗

#include <stdio.h>
typedef int datatype;
#include <stdlib.h>
#define NULL 0
typedef struct node
{
	datatype xi;
	datatype zhi;
	struct node* next;
}node;
void init(node** head) {
	*head = (node*)malloc(sizeof(node));
	(*head)->next = NULL;
}
int length(node* head) {
	node* p; int n = 0;
	p = head;
	while (p->next) {
		p = p->next;
		n++;
	}
	return n;
}
node* insert(node* head, int i, datatype xi,datatype zhi) {
	int j = 0;
	node* p;
	init(&p);
	p = head->next;
	//j计数
	//i是表示插入的位置
	if (!p) {
	}
	while (j < i - 1 && p->next != NULL) {
		p = p->next;
		j = j++;
	}
	if (j == i - 1) {
		node* q = (node*)malloc(sizeof(node));
		init(&q);
		q->xi = xi;
		q->zhi = zhi;
		q->next = p->next;
		p->next = q;
		return head;
	}
}
int find(node* head, int i, datatype* x,datatype*y) {
	int j = 0;
	node* p = head->next;
	while (j < i && p->next != NULL) {
		j = j++;
		p = p->next;
	}
	if (j == i) {
		*x = p->xi;
		*y = p->zhi;		
		return 1;
	}
	return 0;
}
node* deleted(node* head, int i) {
	node* p = head->next;
	int j = 0;
	while (j < i - 1 && p->next != NULL) {
		j = j++;
		p = p->next;
	}if (j == i - 1) {
		p->next = (p->next)->next;
		return head;
	}
}
/*node* sort(node* head1) {
	node* p;
	node* q;
	int j=0;
	int i = length(head1);
	int k;
	init(&p); 
	init(&q);
	for (k = 1; i-1;k++) {
		q = head1->next;
		while (j < i && q->next != NULL) {
			if (q->zhi < (q->next)->zhi) {
				p->next = q->next;
				q->next = q;
				q = p;
			}
			j = j++;
			p = p->next;
		}
	}
	return head1;
}
int sum(node* head1, node* head2) {
	node* head3;
	node* p;
	node* q;
	init(&p);
	init(&q);
	init(&head3);
	int i, j, len1, len2 = 0;
	int count = 1;
	p = head1->next;
	q = head2->next;
	len1 = length(p);
	len2 = length(q);
		for (j = 0; j <= len1; j++) {
			for (i = 0; i <= len2; i++) {
				if (p->zhi = q->zhi)
				{
					head3->xi = p->xi +q->xi;
					head3->zhi = p->zhi;
					head3 = head3->next;
					p = p->next;
					q = q->next;
				}
				else
				{
					head3 = p;
					head3 = head3->next;
					head3 = q;
					head3 = head3->next;
					p = p->next;
					q = q->next;
				}
			}
		}
		sort(head3);
		int len3 = length(head3);
		int x, y;
		for (i = 1; len3; i++) {
			find(head3, i, &x, &y);
			printf("%5dx^%d", x, y);
			if (i < len3)
			{
				printf("    +");
			}
		}
		return 1;
}

int subtract(node* head1, node* head2) {
	node* head3;
	node* p;
	node* q;
	init(&p);
	init(&q);
	init(&head3);
	int i, j, len1, len2 = 0;
	int count = 1;
	p = head1->next;
	q = head2->next;
	len1 = length(p);
	len2 = length(q);
	for (j = 0; j <= len1; j++) {
		for (i = 0; i <= len2; i++) {
			if (p->zhi = q->zhi)
			{
				head3->xi = p->xi + q->xi;
				head3->zhi = p->zhi;
				head3 = head3->next;
				p = p->next;
				q = q->next;
			}
			else
			{
				head3 = p;
				head3 = head3->next;
				head3 = q;
				head3 = head3->next;
				p = p->next;
				q = q->next;
			}
		}
	}
	sort(head3);
	int len3 = length(head3);
	int x, y;
	for (i = 1; len3; i++) {
		find(head3, i, &x, &y);
		printf("%5dx^%d", x, y);
		if (i < len3)
		{
			printf("    +");
		}
	}
	return 1;

}*/
int main() {
	node* head1;
	node* head2;
	int len, x,y;
	init(&head1);
	init(&head2);
	len = length(head1);
	printf("%5d\n", len);
	insert(head1, 1, 3, 3);
	insert(head1, 2, 5, 2);
	insert(head1, 3, 8, 1);
	printf("%5d\n", length(head1));
	for (int i = 1; i <= length(head1); i++) {
		find(head1, i, &x,&y);
		printf("%5dx^%d", x,y);
		if(i<length(head1))
		{
			printf("    +");
		}
	}
	printf("\n");
	insert(head2, 1, 3, 4);
	insert(head2, 2, 8, 1);
	insert(head2, 3, 6, 3);
//	sort(head2);
	for (int i = 1; i <= length(head2); i++) {
		find(head2, i, &x, &y);
		printf("%5dx^%d", x, y);
		if (i < length(head2))
		{
			printf("    +");
		}
	}

}



/*1234

2134
2314
2341

3241
3421
3421

4321
4321
4321
*/

爆这个错误

解决了么,我也出现了这样的错

我也遇到差不多的问题,我是对null指针取了结构体中的int值(即p=null,对p->num进行大小判断),编译能过但是运行没有任何结果输出,debug也是提示这样的错误,我的猜想是因为null指针不指向任何存储单元,因此不能出现“对null指针指向的存储单元取值”的操作,这样的代码只是能过编译(因为编译的时候编译系统是没有办法发现这种在实际运行时可能产生的错误的)但是在实际运行的时候因为运行到这一句无法输出运行结果因此不能进行下一步,因此程序不能跑完完整的代码,程序不会提示运行结束只是停在了那个位置。我的解决办法就是分类讨论,把p==null时单独拎出来再写代码去解决它