Через printf утекает память - C (СИ)

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

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

В общем, имеется программа в 300 строк, в конце кода происходит вывод необходимой информации в консоль.
for(unsigned i=0; i<countWord;i++)
        {
            printf("%s\t%.2f\n",inpWords[i],infoWords[i][0]);
        }
Если запустить valgrind, то он ругается на утечку памяти в строке с printf
==3813== Command: ./main list1.txt
==3813== 
a   1.00
==3813== 
==3813== HEAP SUMMARY:
==3813==     in use at exit: 26,396 bytes in 192 blocks
==3813==   total heap usage: 284 allocs, 92 frees, 36,773 bytes allocated
==3813== 
==3813== 148 (80 direct, 68 indirect) bytes in 1 blocks are definitely lost in loss record 43 of 67
==3813==    at 0x100009EBB: malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==3813==    by 0x1001C48D6: __Balloc_D2A (in /usr/lib/system/libsystem_c.dylib)
==3813==    by 0x1001C521F: __d2b_D2A (in /usr/lib/system/libsystem_c.dylib)
==3813==    by 0x1001C1877: __dtoa (in /usr/lib/system/libsystem_c.dylib)
==3813==    by 0x1001EA3E6: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==3813==    by 0x1002136C8: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==3813==    by 0x1001E9389: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==3813==    by 0x1001E7223: printf (in /usr/lib/system/libsystem_c.dylib)
==3813==    by 0x100001DCF: main (main.c:290)
==3813== 
==3813== 2,064 bytes in 1 blocks are possibly lost in loss record 61 of 67
==3813==    at 0x10000A17C: malloc_zone_malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==3813==    by 0x1004F5EFD: _objc_copyClassNamesForImage (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E9182: protocols() (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E9093: readClass(objc_class*, bool, bool) (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E6C13: gc_init (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004EE24E: objc_initializeClassPair_internal(objc_class*, char const*, objc_class*, objc_class*) (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004FB132: layout_string_create (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E983C: realizeClass(objc_class*) (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E9300: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E92E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E92E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==3813==    by 0x1004E92E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==3813== 
==3813== LEAK SUMMARY:
==3813==    definitely lost: 80 bytes in 1 blocks
==3813==    indirectly lost: 68 bytes in 2 blocks
==3813==      possibly lost: 2,064 bytes in 1 blocks
==3813==    still reachable: 0 bytes in 0 blocks
==3813==         suppressed: 24,184 bytes in 188 blocks
==3813== 
==3813== For counts of detected and suppressed errors, rerun with: -v
==3813== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 18 from 18)
Как только комментирую printf, то в LEAK SUMMARY по нулям почти все
==3855== LEAK SUMMARY:
==3855==    definitely lost: 0 bytes in 0 blocks
==3855==    indirectly lost: 0 bytes in 0 blocks
==3855==      possibly lost: 2,064 bytes in 1 blocks
==3855==    still reachable: 0 bytes in 0 blocks
==3855==         suppressed: 20,088 bytes in 187 blocks

Вопрос, как printf может жрать память? Как этого избежать?

Решение задачи: «Через printf утекает память»

textual
Листинг программы
    unsigned M=1;//Число слов во всех файлах (кол-во строк в массиве)
    char **inpWords=(char**)malloc(M*sizeof(char*));
    double **infoWords=(double**)malloc(M*sizeof(double*));

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

  1. Объявлены две переменные:
    • unsigned M=1; - определяет количество слов во всех файлах, т.е. количество строк в массиве. Значение переменной M равно 1.
    • char **inpWords=(char**)malloc(M*sizeof(char*)); - выделяет память под массив указателей на строки (char*) с помощью функции malloc. Массив имеет размер M.
  2. Переменная infoWords объявлена и инициализирована аналогичным образом, но вместо char* используется double*, так как она будет содержать числовые данные. Пояснение: В данном коде происходит выделение памяти под два массива: inpWords и infoWords. Первый массив содержит строки (char), второй - числовые данные (double). Переменная M определяет количество строк в массиве inpWords.

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


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

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

12   голосов , оценка 4.167 из 5