user-0 提问: c语言 大量数据在写入文件时会崩溃 急求问题所在和解决办法

回复:
user: user-0
content: 引用 楼主 qq_41821823的回复:想实现的功能是建立一堆文本文件的索引，但是现在已经成功创建了一个索引表，但把索引表存入文件的时候就会进行到一半然后崩溃 需要在目录下创建一个book文件夹储存信息 现在的问题 信息太多时候写入最后save_index 崩溃 释放内存好像不行 代码如下 头文件  #ifndef Searchengine_H #define Searchengine_H #include <stdio.h>   #include <windows.h>  #include<stdlib.h> struct word_place    //保存单词的地址  {     int book_id;     char book_name[30];     long int location; }; typedef struct word_place place; typedef struct key* key_node; struct key          //为每个关键词创造一个节点  {     int id;     char key[20];     int  find_number;     place *places; }; key_node key_information[1000000];   struct file_inf    //搜索文件的序号  {     int number;     char name[100]; }file_information[10000];   void find(char * lpPath); int find_word(char* word); void add_key(char* word,int num,long int place) ; int is_letter(char c) ; void index_a_book(int num) ; void kuaipai(int left,int right,key_node a[]) ; void save_index(int x);  #endif  遍历文件夹获取文件信息的文件  #include"search_engine.h" void find(char * lpPath)  //读取一个文件夹的文件名  {       int i=0;      char szFind[MAX_PATH],szFile[MAX_PATH];       WIN32_FIND_DATA FindFileData;       HANDLE hFind;     strcpy(szFind,lpPath);       strcat(szFind,"\\*.*");      hFind = FindFirstFile(szFind,&FindFileData);       if(INVALID_HANDLE_VALUE == hFind)       return;       while(TRUE)       {           if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)           {                if(FindFileData.cFileName[0]!='.')                   {                       strcpy(szFile,lpPath);                       strcat(szFile,"\\");                        strcat(szFile,FindFileData.cFileName);                       find(szFile);                   }           }           else                {                 // printf("%s\n",FindFileData.cFileName);                file_information[i].number=i;               strcpy(file_information[i].name,FindFileData.cFileName);               i++;              }           if(!FindNextFile(hFind,&FindFileData))            {             file_information[i].name[0]='\0';             break;            }     }   }   void save_filenum()//储存文件序列  {     int i=0;     FILE *fp;     if((fp=fopen("book index.txt","r+"))==NULL)     {printf("open error\n");     exit(0);     }     char* is_write="0";     fscanf(fp,"%s",&is_write);     printf("%c\n",is_write);     if (is_write=='0')     fclose(fp);     else     {         is_write="1";         fseek(fp,0,0);         fprintf(fp,"%s\n",is_write);     }     for(i=0;file_information[i].name[0];i++)     {         fprintf(fp,"%d ",file_information[i].number);         fprintf(fp,"%s\n",file_information[i].name);     }     fclose(fp); } 创建和储存索引的函数  #include"search_engine.h"  int find_word(char* word)  //判断是否为已有的关键词  {     int i;      for(i=0;key_information[i];i++)      {          if(strcmp(key_information[i]->key,word)==0)         break;     }      return i; }//少一个储存查找的算法   void add_key(char* word,int num,long int place) //把关键词添加到索引中  {     int i=find_word(word);      if(!key_information[i])     {         key_information[i]=(key_node)malloc(sizeof(struct key));         strcpy(key_information[i]->key,word);         key_information[i]->find_number=1;         key_information[i]->places=(struct word_place*)malloc(100*sizeof(struct word_place)) ;     }     else      key_information[i]->find_number++;     int temp=key_information[i]->find_number-1;     if(temp%98==0)     key_information[i]->places=(struct word_place*)realloc(key_information[i]->places,(temp+100)*sizeof(struct word_place));     strcpy(key_information[i]->places[temp].book_name,file_information[num].name);     key_information[i]->places[temp].book_id=num;     key_information[i]->places[temp].location=place; } int is_letter(char c)  //判断一个字符是否是特殊字符  {     if(c >='0' && c<='9')     return 1;     else if(c >='a' && c<='z' ||  c >='A' && c<='Z')     return 2;     else return 0; } void index_a_book(int num) //为一本书中的单词建立索引  {     FILE *fp;     char* name=file_information[num].name;     char way[100]="book\\";     strcat(way,name);     printf("%s\n",way);     if((fp=fopen(way,"r+"))==NULL)     {printf("open error\n");     exit(0);     }      char* read;     read=(char*)malloc(sizeof(char)*100);      long int place=0;     fseek(fp,0L,SEEK_SET);      while(!feof(fp))     {         fscanf(fp,"%s",read);         if(is_letter(read[strlen(read)-1])==0)         read[strlen(read)-1]=0;         if(is_letter(read[0])==2)//首为必须为字母          {         printf("%s\n",read);          add_key(read,num,place);         place++;          }      }     fclose(fp); } void kuaipai(int left,int right,key_node a[])  //对列表快速排序  {     int i,j;     char* middle;     key_node temp;     i=left;     j=right;     middle=a[(i+j)/2]->key;     do{         while(strcmp(a[i]->key,middle)<0&&i<right)         i++;         while(strcmp(a[j]->key,middle)>0&&j>left)         j--;         if(i<=j)         {             temp=a[i],a[i]=a[j],a[j]=temp;             j--;             i++;         }     }while(i<=j);     if(left<j)     kuaipai(left,j,a);     if(right>i)     kuaipai(i,right,a); }  void save_index(int x)//储存索引  {     FILE *fp;     if((fp=fopen("word index.txt","w+"))==NULL)     {printf("open error\n");     exit(0);     }      printf("open success\n");     printf("%d",x);     int i,j;     fprintf(fp,"%d\n",x);      i=0;     printf("%d %s %d \n",i,key_information[i]->key,key_information[i]->find_number);     printf("%c %d",key_information[i]->key[0],is_letter(key_information[i]->key[0]));     fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number);  /*  for(i=0;i<100;i++)     {         fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number);         for(j=0;j<key_information[i]->find_number;j++)         {             fprintf(fp,"%d %d ",key_information[i]->places[j].book_id,key_information[i]->places[j].location);         }         fprintf(fp,"ok\n");     }*/     fclose(fp); }   主函数 #include"search_engine.h"   //void add index()  int  main()   {    char filepath[MAX_PATH]="book";  //可自己输入文件夹绝对路径   find(filepath);    int i=0; /* for(i=0;file_information[i].name[0];i++)  {     printf("%d %s\n",file_information[i].number,file_information[i].name);  }*/  save_filenum();  for(i=0;file_information[i].name[0];i++) {     index_a_book(i);  } /*for(i=0;key_information[i];i++) {     printf("%s\n",key_information[i]->key); } printf("%s\n",key_information[1]->places[0].book_name);*/ int word_num;     for(i=0;key_information[i];i++)     ;     word_num=i-1; kuaipai(0,word_num,key_information); printf("ok\n"); save_index(word_num); system("PAUSE");  for(i=0;key_information[i];i++) {     free(key_information[i]); }   return 0; }  很急，求大佬解答 数据一大就保存失败，释放内存失败了，到底是什么原理

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。