husky66 2019-09-28 09:53 采纳率: 57.1%
浏览 289
已采纳

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

#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条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!