Я написал функцию, которая пытается объединить две строки, используя динамическое распределение памяти.Я могу понять, что было бы легче, если бы я использовал определенный массив char, но я хотел бы узнать, как управлять памятью в C.
Проблема проста ... При запуске программы с valgrind я обнаружил другую ошибкукак эти:
- Неверная запись размера 1
- Неверное чтение размера 1
- Адрес .... составляет 0 байт [после | внутри] блокаразмер 4 alloc'd.
Я пытался выяснить, где может быть проблема, я сделал, но я не понимал, в чем дело.
Это очень важно для меня, чтобырешить эту проблему, чтобы я мог продолжить домашнее задание и проверить ошибки.
Это код
void _join(char *s1, char *s2)
{
int i = 0;
int len = strlen(s1);
while (i < strlen(s2)){
s1 = realloc(s1, (len + i)*sizeof(char));
s1[len + i]= s2[i];
i++;
}
// I insert that after, but I don't know if it's necessary
s1 = realloc(s1, (len + i + 1)*sizeof(char));
s1[len + i] = '\0';
}
Код переходит со строки 48 на строку 58.
Я вызываю функцию из основного таким образом
_join(s1, s2);
Где s1 и s2 задаются вводом.Затем я вызываю свободную функцию на s1 и s2, потому что я создал ее с помощью malloc.
Фрагменты вывода valgrind
Before: hello
==11005== Invalid write of size 1
==11005== at 0x109322: _join (changeJOIN.c:53)
==11005== by 0x1091E9: main (changeJOIN.c:22)
==11005== Address 0x4a41be4 is 0 bytes after a block of size 4 alloc'd
==11005== at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==11005== by 0x1092FB: _join (changeJOIN.c:52)
==11005== by 0x1091E9: main (changeJOIN.c:22)
==11005==
... Другая ошибка ...
==11005==
==11005== HEAP SUMMARY:
==11005== in use at exit: 9 bytes in 1 blocks
==11005== total heap usage: 17 allocs, 17 frees, 2.109 bytes allocate
==11005==
==11005== 9 bytes in 1 blocks are definitely lost in loss record 1 of 1
==11005== at 0x4839D7B: realloc (vg_replace_malloc.c:826)
==11005== by 0x10935B: _join (changeJOIN.c:56)
==11005== by 0x1091E9: main (changeJOIN.c:22)