首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

在小弟我标注的地方为什么会发生段异常,如何解决

2012-02-06 
在我标注的地方为什么会发生段错误,怎么解决?#includestdio.h#includestdlib.h#includestring.h#inc

在我标注的地方为什么会发生段错误,怎么解决?
#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 的内存位置,实际上也不存在

热点排行
Bad Request.