Очевидно, что вы не можете освободить ввод, поскольку он может быть литералом, часть памяти, которую вы не контролируете.Это нанесло бы ущерб вашей функции даже больше, чем сейчас.
Вы можете вернуть старое значение inputString
, чтобы иметь возможность освободить его при необходимости.
char *ReplaceSubStr(char **inputString, const char *from, const char *to)
{
char *old_string = *inputString;
...
return old_string;
}
Звонящийотвечает за освобождение содержимого old_string
, если это необходимо.
Если не нужно (мы должны обойти ввод char **
, назначив допустимый доступный для записи массив указателю, чтобы можно было передать этот указатель:
char input[]="hello world";
char *ptr = input;
ReplaceSubStr(&ptr, "hello", "hi");
// input is now "hi world" in a different location
free(ptr); // when replaced string isn't needed
если необходимо:
char *input = strdup("hello world");
char *old_input = ReplaceSubStr(&input, "hello", "hi");
free(old_input);
или просто
free(ReplaceSubStr(&input, "hello", "hi"));
тогда всегда (когда заменяемая строка не требуется):
free(input);
Единственное ограничение заключается в том, что вы не можете использовать постоянный строковый литерал в качестве входных данных (const char *input = "hello world"
) из-за прототипа и возможного возврата char *
для передачи в free
.