Доброго времени суток!
Хотел уточнить несколько моментов.
Допустим мы имеем указатель на строку (char* str). Необходимо её обрезать (оставить первые n/2 символов). Я так понимаю нужно найти начальную позицию(begin), конечную (end) и вызвать memmove. Затем почистить память str. В таком случае, мы получим лишние затраты по памяти в определённый момент выполнения программы.
Можно также влепить \0 на позиции end, но тогда получится что ошмётки строки будут безвозвратно потеряны.
Вопрос:
1. Какой метод по "обрезанию" строки наиболее практичен?
2. Есть-ли в моих суждениях ошибки?
3. Возможно ли провернуть фокус с освобождением только последней части строки? delete (str + pos) или нечто в этом роде?
Стоп-стоп-стоп. Откуда взялось delete? Мы про C или C++?
В любом случае, delete можно давать на вход только то, что вернула когда-то new. Если вы скормите delete лажу вроде указателя на середину строки, будет неопределенное поведение.
Мы про си.
Про delete понял. Память выделяется стандартной инициализацией при объявлении: char str[] = "string";
Я так понимаю в си для это служит free.
В любом случае получается нельзя освободить память с середины и до конца. Наверно потому что при объявлении (или при динамическом выделении) было указано количество выделенных байт, а если мы передадим указатель на середину, то нельзя будет определить сколько байт освободить, так?
devbutch: Память, которую выделили так: char str[] = "string", нельзя освобождать при помощи free. free можно скармливать только тот указатель, который выдал malloc или realloc.
для "укорачивания" выделенного массива в C есть realloc.
Гипотеза про передачу указателя на середину верна.
Извините что продолжил ветку - возник вопрос.
free() - для тех областей что были выделены через malloc и realoc.
delete и delete[] - для тех что были выделены посредством new.
А если переменная была обявлена так: char str[] = "string"? Как очистить память для неё?
Кажется я докумекал.
У меня возникали траблы когда я передавал в f(char* str),
переменную char text[] = "string" - f(text)
и там пытался освободить память. И возникает ситуация когда я освобождаю память передавая не указатель, а переменную - char[].