Через printf утекает память - C (СИ)
Формулировка задачи:
В общем, имеется программа в 300 строк, в конце кода происходит вывод необходимой информации в консоль.
Если запустить valgrind, то он ругается на утечку памяти в строке с printf
Как только комментирую printf, то в LEAK SUMMARY по нулям почти все
for(unsigned i=0; i<countWord;i++) { printf("%s\t%.2f\n",inpWords[i],infoWords[i][0]); }
==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)
==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*));
Объяснение кода листинга программы
- Объявлены две переменные:
unsigned M=1;
- определяет количество слов во всех файлах, т.е. количество строк в массиве. Значение переменной M равно 1.char **inpWords=(char**)malloc(M*sizeof(char*));
- выделяет память под массив указателей на строки (char*) с помощью функцииmalloc
. Массив имеет размер M.
- Переменная
infoWords
объявлена и инициализирована аналогичным образом, но вместоchar*
используетсяdouble*
, так как она будет содержать числовые данные. Пояснение: В данном коде происходит выделение памяти под два массива:inpWords
иinfoWords
. Первый массив содержит строки (char), второй - числовые данные (double). ПеременнаяM
определяет количество строк в массивеinpWords
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д