在我标注的地方为什么会发生段错误,怎么解决?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
struct course_taken
{
char courseno[20];
float credit;
int grade;
struct course_taken *next;
};
typedef struct course_taken course;
typedef struct student
{
char first_name[10];
char last_name[10];
int age;
char student_id[20];
char gender; //M or F
float GPA;
struct course_taken *course_list;
} Data;
typedef struct list_node
{
Data d;
struct list_node *next;
} Node;
#define Max_size 50010
void red_words(FILE *p,char *name[],int *n);
Node * initialize(FILE *fp1,FILE *fp2);
int main()
{
char *course[30];
FILE *fp1 = NULL;
FILE *fp2;
Data d[Max_size];
int i,n,j;
Node *head;
if( (fp1 = fopen( "courses.txt ", "r ")) == NULL ){
printf( "Open file failure!!\n ");
return;
}
if( (fp2 = fopen( "students.txt ", "r ")) == NULL ){
printf( "Open file failure!!\n ");
return;
}
for( i = 0;i < 30;i++)
course[i] = NULL;
red_words(fp1,course,&n);
for( i = 0; i < n ; i++ ) {
printf( "%s ",course[i]);
}
printf( "\n ");
head = initialize(fp1,fp2);
}
Node * initialize(FILE *fp1,FILE *fp2)
{
Node *head, *tail;
int i,n;
char b1[20],b2[20],b3[20],b4[20],b5[20],b6[20];
int g1,g2,g3,g4,g5,g6;
head = (Node *) malloc(sizeof(Node));
tail = head;
while( (fscanf( fp2, "%s %s %d %s %c %s %d %s %d %s %d %s %d %s %d %s %d ", tail -> d.first_name,tail -> d.last_name, &tail -> d.age,tail -> d.student_id,&tail -> d.gender,b1,&g1,b2,&g2,b3,&g3,b4,&g4,b5,&g5,b6,&g6) == 17)) {
tail -> d.course_list -> grade = g1;//这里为什么会发生段错误,该怎么改?
/*tail -> d.course_list -> next -> grade = g2;
tail -> d.course_list -> next -> next -> grade = g3;
tail -> d.course_list -> next -> next -> next -> grade = g4;
tail -> d.course_list -> next -> next -> next -> next -> grade = g5;
tail -> d.course_list -> next -> next -> next -> next -> next -> grade = g6;*/
printf( "%s %s %d %s %c %s %d %s %d %s %d %s %d %s %d %s %d \n ", tail -> d.first_name,tail -> d.last_name, tail -> d.age,tail -> d.student_id,tail -> d.gender,b1,g1,b2,g2,b3,g3,b4,g4,b5,g5,b6,g6);
tail -> next = (Node *) malloc(sizeof(Node));
tail = tail -> next;
}
tail -> next = NULL;
return head;
}
void red_words(FILE *p,char *name[],int *n)
{
char b[300];
char c;
int i,j=0;
while( ( c = fgetc(p) ) != EOF) {
i = 0;
while(c != EOF && c != '\n ' && c != ' ') {
b[i] = c;
i++;
c = fgetc( p );
}
b[i] = '\0 ';
name[j] = ( char *) malloc(sizeof( char ) * ( strlen( b ) + 1) );
if( name[j] == NULL )
printf( "Memory allocate Failure !!\n ");
else {
strcpy(name[j],b);
j++;
}
}
*n=j;
}
courses.txt中的数据如下:
Basic Lisp C# Perl Oracle JAVA C C++ datastructures algorithms PE operatingsystems compiler
calculus linearalgebra Maogai English1 English2 Music computergraphics
students.txt 中的部分数据如下:
phqg hume 27 N3050100001 M Basic 85 Lisp 85 C# 61 Perl 87 Oracle 61 JAVA 71
firc vscx 27 N3050100002 M Basic 81 Lisp 96 C# 98 Perl 75 Oracle 67 JAVA 66
duxw fnfo 28 N3050100003 F Basic 62 Lisp 73 C# 93 Perl 84 Oracle 81 JAVA 91
repg gxrp 28 N3050100004 F Basic 69 Lisp 78 C# 96 Perl 95 Oracle 90 JAVA 62
cysy ycqp 25 N3050100005 F Basic 70 Lisp 90 C# 66 Perl 81 Oracle 93 JAVA 88
znim kkas 31 N3050100006 M Basic 84 Lisp 99 C# 86 Perl 63 Oracle 77 JAVA 78
ycxf xtls 29 N3050100007 M Basic 77 Lisp 86 C# 93 Perl 86 Oracle 81 JAVA 85
ooef xzbc 21 N3050100008 M Basic 61 Lisp 96 C# 95 Perl 67 Oracle 75 JAVA 74
boyg poey 32 N3050100009 F Basic 67 Lisp 77 C# 77 Perl 67 Oracle 93 JAVA 83
vrvi pyam 31 N3050100010 M Basic 73 Lisp 68 C# 80 Perl 91 Oracle 62 JAVA 75
qpmx ujjl 22 N3050100011 M Basic 71 Lisp 96 C# 74 Perl 80 Oracle 96 JAVA 81
whms ncbx 23 N3050100012 M Basic 80 Lisp 88 C# 67 Perl 87 Oracle 68 JAVA 73
atxd knly 34 N3050100013 M Basic 75 Lisp 71 C# 60 Perl 69 Oracle 99 JAVA 96
[解决办法]
tail -> d.course_list -> grade course_list 只是一个指针,使用前指向的用户空间没有指定,编译器将找不到grade 的内存位置,实际上也不存在