user-0 提问: 关于同类型指针赋值的问题

回复:
user: user-0
content: 引用 8 楼 cyfcsd 的回复:根据你的代码构建了一个运行环境，读数据是没有问题的，你看一下吧 #include "stdio.h" #include "string.h" #include "stdlib.h"  typedef struct USER { 	int number; 	char name[20]; 	char code[20]; 	int itema; 	struct ITEM* a; 	struct USER* next; }*user;  typedef struct LinkList { 	int amount; 	struct USER* next; }*userlist;  typedef int Status;  Status InitList(userlist *p) { 	user q; 	*p=(userlist)malloc(sizeof(struct LinkList)); 	(*p)->amount=0; 	q=(user)malloc(sizeof(struct USER)); 	q->number=0; 	q->name[0]='a'; 	q->name[1]='d'; 	q->name[2]='m'; 	q->name[3]='i'; 	q->name[4]='n'; 	q->name[5]='\0'; 	q->code[0]='a'; 	q->code[1]='d'; 	q->code[2]='m'; 	q->code[3]='i'; 	q->code[4]='n'; 	q->code[5]='\0'; 	q->a=NULL; 	q->next=NULL; 	if(!p) /* 存储分配失败 */ 		exit(0); 	(*p)->next=q; 	return 1; }   int ReadFile(userlist p) { 	FILE *fp; 	user q,q2; 	struct ITEM *n,*n2; 	int i,j; 	q2=p->next; 	if((fp=fopen("memory.txt","r"))!=NULL) 	{ 		fscanf(fp,"%d,",&(p->amount)); 		printf("%d",p->amount); 		for(i=1;i<=p->amount;i++) 		{ 			q=(user)malloc(sizeof(struct USER)); 			fscanf(fp,"%d%20s%20s%d,",&(q->number),&(q->name),&(q->code),&(q->itema)); 			printf("%d,%s,%s,%d,",(q->number),(q->name),(q->code),(q->itema)); 			q2->next=q;  			n2=q->a; 			/*	for(j=1;j<=q->itema;j++) 			{ 			n=(item)malloc(sizeof(struct ITEM)); 			fscanf(fp,"%d%20s%d,%d,%d,%d,%d,",&(n->number),&(n->name),&(n->amount),&(n->year),&(n->month),&(n->day),&(n->sort)); 			n2->next=n; 			n2=n; 			} 			n2->next=NULL;*/ 		}   		fclose(fp); 	}  	return 0; }  int main() {	 	int px,py; 	int result; 	userlist a; 		char c; 	//CreateThread( NULL,0,ThreadProc1,NULL,0, NULL);  	InitList(&a);   	ReadFile(a); 	system("pause"); 	return 0; }    老兄，太感谢了，你让我知道了问题不是只出现在我给的这些代码里，之前一直觉得全部问题都在这，所以怎么都想不明白！现在看看其他地方，问题解决了！！！！多谢！！！！可以写作业报告啦！！！

user: user-1
content: 根据你的代码构建了一个运行环境，读数据是没有问题的，你看一下吧 #include "stdio.h" #include "string.h" #include "stdlib.h"  typedef struct USER { 	int number; 	char name[20]; 	char code[20]; 	int itema; 	struct ITEM* a; 	struct USER* next; }*user;  typedef struct LinkList { 	int amount; 	struct USER* next; }*userlist;  typedef int Status;  Status InitList(userlist *p) { 	user q; 	*p=(userlist)malloc(sizeof(struct LinkList)); 	(*p)->amount=0; 	q=(user)malloc(sizeof(struct USER)); 	q->number=0; 	q->name[0]='a'; 	q->name[1]='d'; 	q->name[2]='m'; 	q->name[3]='i'; 	q->name[4]='n'; 	q->name[5]='\0'; 	q->code[0]='a'; 	q->code[1]='d'; 	q->code[2]='m'; 	q->code[3]='i'; 	q->code[4]='n'; 	q->code[5]='\0'; 	q->a=NULL; 	q->next=NULL; 	if(!p) /* 存储分配失败 */ 		exit(0); 	(*p)->next=q; 	return 1; }   int ReadFile(userlist p) { 	FILE *fp; 	user q,q2; 	struct ITEM *n,*n2; 	int i,j; 	q2=p->next; 	if((fp=fopen("memory.txt","r"))!=NULL) 	{ 		fscanf(fp,"%d,",&(p->amount)); 		printf("%d",p->amount); 		for(i=1;i<=p->amount;i++) 		{ 			q=(user)malloc(sizeof(struct USER)); 			fscanf(fp,"%d%20s%20s%d,",&(q->number),&(q->name),&(q->code),&(q->itema)); 			printf("%d,%s,%s,%d,",(q->number),(q->name),(q->code),(q->itema)); 			q2->next=q;  			n2=q->a; 			/*	for(j=1;j<=q->itema;j++) 			{ 			n=(item)malloc(sizeof(struct ITEM)); 			fscanf(fp,"%d%20s%d,%d,%d,%d,%d,",&(n->number),&(n->name),&(n->amount),&(n->year),&(n->month),&(n->day),&(n->sort)); 			n2->next=n; 			n2=n; 			} 			n2->next=NULL;*/ 		}   		fclose(fp); 	}  	return 0; }  int main() {	 	int px,py; 	int result; 	userlist a; 		char c; 	//CreateThread( NULL,0,ThreadProc1,NULL,0, NULL);  	InitList(&a);   	ReadFile(a); 	system("pause"); 	return 0; }

user: user-0
content: 引用 2 楼 qq423399099 的回复:这样的用法是完全可以的，之所以出错很可能是因为等号左边的q2->next; 严重怀疑你的q2指针是空指针或者野指针 建议贴出完整代码。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 不求解决那些乱七八糟的拒绝访问的问题，只要能解决这个指针的问题就好！多谢！

user: user-0
content: 引用 2 楼 qq423399099 的回复:这样的用法是完全可以的，之所以出错很可能是因为等号左边的q2->next; 严重怀疑你的q2指针是空指针或者野指针 建议贴出完整代码。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。  代码已经贴上。我用的VS，正常调试时拒绝访问，只能用CTRL+F5才能运行。以这种方式运行时按ALT+数字，啥窗口也没有，只有嘟嘟，求助

user: user-0
content: 此为结构体声明 typedef struct USER { int number; char name[20]; char code[20]; int itema; struct ITEM* a; struct USER* next; }*user;  typedef struct LinkList { 	int amount; 	struct USER* next; }*userlist;   此为main()函数开头 int main() {	int px,py; 	Status result; 	userlist a; 	CreateThread( NULL,0,ThreadProc1,NULL,0, NULL);  	InitList(&a); 	TCHAR logo[5]={L"SCUT"};   // 初始化绘图窗口 	initgraph(800, 650); 	int v=1,qr=-1,count=0; 	TCHAR ch[2]; 	char c; 	ReadFile(a);  此为InitList（） Status InitList(userlist *p) { 	user q; 	*p=(userlist)malloc(sizeof(struct LinkList)); 	(*p)->amount=0; 	q=(user)malloc(sizeof(struct USER)); 	q->number=0; 	q->name[0]='a'; 	q->name[1]='d'; 	q->name[2]='m'; 	q->name[3]='i'; 	q->name[4]='n'; 	q->name[5]=NULL; 	q->code[0]='a'; 	q->code[1]='d'; 	q->code[2]='m'; 	q->code[3]='i'; 	q->code[4]='n'; 	q->code[5]=NULL; 	q->a=NULL; 	q->next=NULL; 	if(!p) /* 存储分配失败 */ 	exit(OVERFLOW); 	(*p)->next=q; 	return OK; }  此为ReadFile（） Status ReadFile(userlist p) { FILE *fp; user q,q2; item n,n2; int i,j; q2=p->next; if((fp=fopen("memory.txt","r"))!=NULL) { 	fscanf(fp,"%d,",&(p->amount)); 	printf("%d",p->amount);   	for(i=1;i<=p->amount;i++) 	{ 		q=(user)malloc(sizeof(struct USER)); 		fscanf(fp,"%d%20s%20s%d,",&(q->number),&(q->name),&(q->code),&(q->itema));printf("%d,%s,%s,%d,",(q->number),(q->name),(q->code),(q->itema)); 		q2->next=q; 		 		n2=q->a; 	/*	for(j=1;j<=q->itema;j++) 		{ 			n=(item)malloc(sizeof(struct ITEM)); 			fscanf(fp,"%d%20s%d,%d,%d,%d,%d,",&(n->number),&(n->name),&(n->amount),&(n->year),&(n->month),&(n->day),&(n->sort)); 			n2->next=n; 			n2=n; 		} 		n2->next=NULL;*/ 	}   	fclose(fp); }  return 0; }  此为memory.txt的内容 1,1a                   a                   0,

user: user-2
content: 这个图谷歌浏览器打开看不清啊

user: user-1
content: 跟指针类型没关系，类型错误编译就过不了，等不到运行时报错 建议多贴一些代码，或者详细的错误信息

user: user-3
content: 这样的用法是完全可以的，之所以出错很可能是因为等号左边的q2->next; 严重怀疑你的q2指针是空指针或者野指针 建议贴出完整代码。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。

user: user-0
content: 在网上查了一下，貌似跟malloc返回的地址是不确定的有关，不过还是不知道怎么改T_T