Утечка памяти в программе, которая считывает и выводит строку - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть вот такая простая программа, считывающая строку с клавиатуры и выводящая ее. Программа рабочая, но valgrind находит утечку, хотя все освобождено Программа (не эта, но с аналогичной проблемой, просто более громоздкая) должна пройти тестирование в специальной системе, так что просто забыть о проблеме не вариант Заранее спасибо за любые советы
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(){
  5. char* string =(char*)malloc(50*sizeof(char));
  6. int i = 0,
  7. N = 0;
  8. while((string[i] = getchar()) != EOF) {
  9. if(string[i] == '\n') N++;
  10. i++;
  11. }
  12. printf("%s\n", string);
  13. free(string);
  14. return 0;
  15. }

Решение задачи: «Утечка памяти в программе, которая считывает и выводит строку»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. void LowerRegister(char** pStrings,int NN,char** pNewStrings)
  6. {
  7.    if (!NN)
  8.    {
  9.       return;
  10.    }
  11.  
  12.    for (int ii = 0; ii < NN; ++ii)
  13.    {
  14.       for (int jj = 0; true; ++jj)
  15.       {
  16.          int   iChr = pStrings[ii][jj];
  17.  
  18.          if (iChr)
  19.          {
  20.             pNewStrings[ii][jj] = (char)(((iChr >= 'A') && (iChr <= 'Z'))  ?  iChr | 0x20  :  iChr);
  21.          }
  22.          else
  23.          {
  24.             break;
  25.          }
  26.       }
  27.    }
  28. }
  29.  
  30. int main(int argc,char** argv)
  31. {
  32.    const int   MAX_STRING = 5;
  33.    const int   MAX_LENGTH = 5;
  34.  
  35.    char**   pStrings = (char**)malloc(sizeof(char*) * MAX_STRING);
  36.  
  37.    if (!pStrings)
  38.    {
  39.       printf("\nErr: Memory error.\n");
  40.       return 0;
  41.    }
  42.  
  43.    memset(pStrings,0,sizeof(char*) * MAX_STRING);
  44.  
  45.    int   ii = 0;
  46.    int   jj = 0;
  47.  
  48.    for (ii = 0; ii < MAX_STRING; ++ii)
  49.    {
  50.       pStrings[ii] = (char*)malloc(MAX_LENGTH + 1);
  51.  
  52.       if (pStrings[ii])
  53.       {
  54.          memset(pStrings[ii],0,MAX_LENGTH + 1);
  55.       }
  56.       else
  57.       {
  58.          for (jj = 0; jj < ii; ++jj)
  59.          {
  60.             if (pStrings && pStrings[jj])
  61.             {
  62.                free(pStrings[jj]);
  63.                pStrings[jj] = NULL;
  64.             }
  65.          }
  66.  
  67.          if (pStrings)
  68.          {
  69.             free(pStrings);
  70.             pStrings = NULL;
  71.          }
  72.  
  73.          printf("\nErr: Memory error.\n");
  74.          return 0;
  75.       }
  76.    }
  77.  
  78.    char**   pNewStrings = (char**)malloc(sizeof(char*) * MAX_STRING);
  79.  
  80.    if (!pNewStrings)
  81.    {
  82.       printf("\nErr: Memory error.\n");
  83.       return 0;
  84.    }
  85.  
  86.    memset(pNewStrings,0,sizeof(char*) * MAX_STRING);
  87.  
  88.    for (ii = 0; ii < MAX_STRING; ++ii)
  89.    {
  90.       pNewStrings[ii] = (char*)malloc(MAX_LENGTH + 1);
  91.  
  92.       if (pNewStrings[ii])
  93.       {
  94.          memset(pNewStrings[ii],0,MAX_LENGTH + 1);
  95.       }
  96.       else
  97.       {
  98.          for (int jj = 0; jj < MAX_STRING; ++jj)
  99.          {
  100.             if (pStrings && pStrings[jj])
  101.             {
  102.                free(pStrings[jj]);
  103.                pStrings[jj] = NULL;
  104.             }
  105.          }
  106.  
  107.          if (pStrings)
  108.          {
  109.             free(pStrings);
  110.             pStrings = NULL;
  111.          }
  112.  
  113.          for (jj = 0; jj < ii; ++jj)
  114.          {
  115.             if (pNewStrings && pNewStrings[jj])
  116.             {
  117.                free(pNewStrings[jj]);
  118.                pNewStrings[jj] = NULL;
  119.             }
  120.          }
  121.  
  122.          if (pNewStrings)
  123.          {
  124.             free(pNewStrings);
  125.             pNewStrings = NULL;
  126.          }
  127.  
  128.          printf("\nErr: Memory error.\n");
  129.          return 0;
  130.       }
  131.    }
  132.  
  133.    ii = 0;
  134.    jj = 0;
  135.  
  136.    int   NN = 0;
  137.    
  138.    int   iChr = 0;
  139.  
  140.    while ((iChr = getchar()) != EOF)
  141.    {
  142.       if (iChr == '\n')
  143.       {
  144.          jj = 0;
  145.  
  146.          ++ii;
  147.          ++NN;
  148.  
  149.          if (ii > MAX_STRING)
  150.          {
  151.             for (ii = 0; ii < MAX_STRING; ++ii)
  152.             {
  153.                if (pStrings && pStrings[ii])
  154.                {
  155.                   free(pStrings[ii]);
  156.                   pStrings[ii] = NULL;
  157.                }
  158.  
  159.                if (pNewStrings && pNewStrings[ii])
  160.                {
  161.                   free(pNewStrings[ii]);
  162.                   pNewStrings[ii] = NULL;
  163.                }
  164.             }
  165.  
  166.             if (pStrings)
  167.             {
  168.                free(pStrings);
  169.                pStrings = NULL;
  170.             }
  171.  
  172.             if (pNewStrings)
  173.             {
  174.                free(pNewStrings);
  175.                pStrings = NULL;
  176.             }
  177.  
  178.             printf("\nErr: Too many strings.\n");
  179.             return 0;
  180.          }
  181.       }
  182.       else if (jj > (MAX_LENGTH + 1))
  183.       {
  184.          for (ii = 0; ii < MAX_STRING; ++ii)
  185.          {
  186.             if (pStrings && pStrings[ii])
  187.             {
  188.                free(pStrings[ii]);
  189.                pStrings[ii] = NULL;
  190.             }
  191.      
  192.             if (pNewStrings && pNewStrings[ii])
  193.             {
  194.                free(pNewStrings[ii]);
  195.                pStrings = NULL;
  196.             }
  197.          }
  198.  
  199.          if (pStrings)
  200.          {
  201.             free(pStrings);
  202.             pStrings = NULL;
  203.          }
  204.  
  205.          if (pNewStrings)
  206.          {
  207.             free(pNewStrings);
  208.             pNewStrings = NULL;
  209.          }
  210.  
  211.          printf("\nErr: Too many symbols in the string.\n");
  212.          return 0;
  213.       }
  214.       else
  215.       {
  216.          pStrings[ii][jj++] = (char)iChr;
  217.          pStrings[ii][jj]   = 0; // Ensure ASCIIZ
  218.       }
  219.    }
  220.  
  221.    LowerRegister(pStrings,NN,pNewStrings);
  222.  
  223.    for (ii = 0; ii < NN; ++ii)
  224.    {
  225.       printf("%s\n",pNewStrings[ii]);
  226.    }
  227.  
  228.    for (ii = 0; ii < MAX_STRING; ++ii)
  229.    {
  230.       if (pStrings && pStrings[ii])
  231.       {
  232.          free(pStrings[ii]);
  233.          pStrings[ii] = NULL;
  234.       }
  235.  
  236.       if (pNewStrings && pNewStrings[ii])
  237.       {
  238.          free(pNewStrings[ii]);
  239.          pNewStrings[ii] = NULL;
  240.       }
  241.    }
  242.  
  243.    if (pStrings)
  244.    {
  245.       free(pStrings);
  246.       pStrings = NULL;
  247.    }
  248.  
  249.    if (pNewStrings)
  250.    {
  251.       free(pNewStrings);
  252.       pNewStrings = NULL;
  253.    }
  254.  
  255.    return 0;
  256. }

Объяснение кода листинга программы

Этот код считывает строки из стандартного ввода до тех пор, пока не будет введено что-то, что не является символом строки. Затем он преобразует каждую строку в нижний регистр. Если вводится больше строк, чем есть в массиве, код выведет сообщение об ошибке и завершит работу. Если вводится строка, которая превышает максимально допустимую длину, код также выведет сообщение об ошибке и завершит работу. Код использует динамическое выделение памяти для хранения вводимых строк и преобразованных строк.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы