husky66 2019-09-28 09:53 采纳率: 33.3%
浏览 290
已采纳

为啥开辟的堆内存释放不了?

#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#include<time.h>

//1.定义一个结构体
struct dicts
{
    char * word;
    char * trans;
};

 int main(void)
{
     int MAXNUM = 0;
     char arr[1024] = { 0 };
     int i = 0;


     FILE * fp = fopen("D:\\dict.txt", "r");
     if (!fp)
     {
         printf("文件打开失败!");
         return -1;
     }

     while (!feof(fp))
     {
         fgets(arr, 1024, fp);
         i++;
     }
     MAXNUM = i / 2;
     printf("共收录%d个单词\n", MAXNUM);

     struct dicts * dic = (struct dicts *) malloc(sizeof(struct dicts)*MAXNUM);
     struct dicts * dic1 = (struct dicts *) malloc(sizeof(struct dicts));


     dic1->word = '\0';
     dic1->trans = '\0';

     rewind(fp);
     //将所有的单词都读取到dic中
     i = 0;
     while (!feof(fp))
     {
         //printf("%d\n", i);
         memset(arr, 0, 1024);
         fgets(arr, 1024, fp);
         //printf("%s\n", arr);
         dic[i].word = (char *)malloc(strlen(arr) + 1);
         memset(dic[i].word, 0, strlen(arr) + 1);
         strncpy(dic[i].word, arr, strlen(arr) + 1);

         memset(arr, 0, 1024);
         fgets(arr, 1024, fp);
         //printf("%s\n", arr);
         dic[i].trans = (char *)malloc(strlen(arr) + 1);
         memset(dic[i].trans, 0, strlen(arr) + 1);
         strncpy(dic[i].trans, arr, strlen(arr) + 1);

         i++;
         //printf("%d\n", i);
     }

     fclose(fp);

     time_t start_time;
     time_t end_time;

     while (1)
     {
         printf("请输入要查找的单词(若想退出请输入“exit()”):\n");
         while (1)
         {
             memset(arr, 0, 1024);
             scanf("%s", arr);
             if (strlen(arr) > 1024)
             {
                 printf("输入的字符数过大,请从新输入!\n");
             }
             else
             {
                 break;
             }
         }
         getchar();//接收回车

         if (!strncmp(arr, "exit()", 6))
         {
             printf("退出成功!\n");
             break;
         }

         //将arr中的单词改成标准格式  #单词
         int len = strlen(arr);
         for (int j = 0; j < len; j++)
         {
             arr[len - j] = arr[len - j - 1];
         }
         arr[0] = '#';

         i = 0;
         //查找单词
         printf("正在查找,请稍后......\n");
         start_time = time(NULL);
         while (1)
         {

             if (!strncmp(arr, dic[i].word, strlen(arr)))
             {
                 dic1->word = (char*)malloc(strlen(arr) + 1);
                 strncpy(dic1->word, arr, strlen(arr) + 1);

                 dic1->trans = (char *)malloc(strlen(dic[i].trans) + 1);
                 strncpy(dic1->trans, dic[i].trans, strlen(dic[i].trans) + 1);

                 printf("%s\n", dic1->word);
                 printf("%s\n", dic1->trans);
                 free(dic1->trans);
                 free(dic1->word);

                 break;
             }

             i++;
             if (i >= MAXNUM)
             {
                 printf("没有查找到该单词!\n");
                 break;
             }
         }

         end_time = time(NULL);
         printf("本次查询用时:%ld(s)\n", (long)(end_time - start_time));

     }

     for ( i = 0; i < MAXNUM; i++)
     {
         free(dic[i].word);
         free(dic[i].trans);
     }

     free(dic1);
     free(dic);

     return 0;
}

为啥最后输入exit()后,最后两行 free(dic1)和 free(dic)释放不了,老是卡在这运行不了。

  • 写回答

3条回答 默认 最新

  • threenewbee 2019-09-28 13:17
    关注

    调试下代码,看看dic1和dic是不是已经释放,释放了2次,或者是野指针。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?