快疯了,动态分配的内存重叠

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

结构体定义  
  typedef   struct   databaselnode  
  {  
  int stunumber;  
  char stuname[40];  
  int stuage;  
  char stusex[40];  
  char stuadd[40];  
  char stutime[40];  
  char stutel[40];  
   
    struct   databaselnode   *next;  
    }databaselnode,*database;  
  database   head;  
   
   
  head已经分配空间并且head->next=null;  
  然后:怪事出现了:  
  在下面这个函数中动态分配的内存地址居然跑回去了  
  和前面动态分配的重叠在一起  
   
  void   readfile(void)  
  {  
  database   q,p;/*定义2个数据变量*/  
  file   *fp;  
  char   str[40];  
    q=(database)malloc(sizeof(database));/*为q动态分配内存空间*/  
   
    head->next=q;/*取数据库的第一个值*/  
   
   
    if((fp=fopen("data.txt","r"))==null)/*打开数据文件*/  
    {printf("%s\n","没有数据库文件;请新建数据库");  
      head->next=null;  
     
      free(q);/*释放q的空间*/  
      return;/*当没有数据文件的时候,就不用读取*/  
    }  
   
  do  
  {  
  fgets(str,40,fp);//学号  
  q->stunumber=chartonum(str);//读的字符转为数字  
  printf("%d\n",q->stunumber);  
   
  fgets(q->stuname,40,fp);//名字//多读了回车,下面删除掉  
  q->stuname[strlen(q->stuname)-1]=\0;  
  printf("%s\n",q->stuname);  
   
          fgets(str,40,fp);//年龄  
  q->stuage=chartonum(str);  
  printf("%d\n",q->stuage);  
   
  char   ss[40];//性别  
  fgets(ss,40,fp);//多读了回车,下面删除掉  
  ss[strlen(ss)-1]=\0;  
  strcpy(q->stusex,ss);  
   
  fgets(q->stuadd,40,fp);//地址  
  q->stuadd[strlen(q->stuadd)-1]=\0;  
   
  fgets(q->stutime,40,fp);//入学时间  
  q->stutime[strlen(q->stutime)-1]=\0;  
   
  fgets(q->stutel,40,fp);//电话  
  if(feof(fp)==0)/*如果不是在文件末尾,才去掉最后的换行符,因为最后一个数据没有换行符*/  
  {  
    q->stutel[strlen(q->stutel)-1]=\0;  
  }  
  printf("%s\n",q->stutel);  
   
  p=(database)malloc(sizeof(database));  
   
   
  q->next=p;  
  q=q->next;  
   
  }while(feof(fp)==0);/*如果没有到文件末尾,则循环上去*/  
  q=null;  
    fclose(fp);  
   
     
  }  
   
   
  到底是怎么回事啊  
  难道系统会自动释放malloc分配的空间吗?昏  
  附需要读取的文件  
   
   
  6  
  6  
  6  
  6  
  6  
  6  
  6  
  1  
  1  
  1  
  1  
  1  
  1  
  1  
  3  
  3  
  3  
  3  
  3  
  3  
  3  
  2  
  2  
  2  
  2  
  2  
  2  
  2

· 网友精彩回答:

发表者:cooljjyy

大概看了一眼,没看出什么问题。不过一般用链表的用法不用像你那么麻烦需要定义一个q变量去保存最后一个元素的位置。你只要新创建节点以后,把原来的head链接到新节点的next,再用新节点作为head就可以了。如果你要保证顺序就用双向链表。最后反向输出就可以了。  
   
        p   =   malloc(...)  
        p->next   =   head;  
        head   =   p;

.
处理 SSI 文件时出错
© 2006-2008 All Rights Reserved