Функция JOIN на языке c - PullRequest
1 голос
/ 24 мая 2019

Я написал функцию, которая пытается объединить две строки, используя динамическое распределение памяти.Я могу понять, что было бы легче, если бы я использовал определенный массив 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)

1 Ответ

3 голосов
/ 24 мая 2019

более чистая реализация:

char *_join(char *s1, char *s2)
{
    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);
    s1 = realloc(s1, len1 + len2 + 1); // +1 for null terminator.
    memcpy(s1 + len1, s2, len2 + 1);

    return s1;
}

Это должно исправить ваши проблемы с valgrind и намного чище.

Убедитесь, что вы называете его как s1 = _join(s1, s2), потому что realloc сделает недействительным s1.

...