Это не совсем ответ на вопрос, как работает бесплатная, но я бы сделал что-то вроде этого:
char * trim_realloc (char * str) {
char * p = str;
char * e;
char * ne; // новый конец
char * r;
size_t len;
// Since you put this level of error testing in your program
if (!str) {
return str; // str is NULL
}
while (*p || isspace(*p) ) {
p++;
}
len = strlen(p);
e = p + len;
ne = e;
while (ne > p) {
if (isspace(*ne)) {
*ne = 0;
ne--;
} else {
break;
}
}
if (p == str) {
if (e != ne) {
return realloc(str, len+1); // only tail trim -- you could just return str here
} else {
return str; // no actual trim
}
} else {
r = strdup(p);
free(str); // str is the head of the string, so that's what we have to free
return r;
}
}
Вы должны отметить мой комментарий в строке с realloc
Поскольку я все равно обнуляю конечный пробел (и поскольку многие реализации realloc беспокоятся только о том, «достаточно ли он большой», а не о «слишком много лишнего пробела»), вы можете просто дайте буферу, в котором жила ваша строка, занять слишком много места в конце. Он все еще \ 0 завершается в правильном месте (если в моем непроверенном коде есть ошибки, которые могут быть).
Другие вещи, которые вы могли бы сделать, это просто переместить строку в начало буфера и затем обрезать хвост так, чтобы:
" cat "
прошел через шаги:
"с котом"
"кошка кошка"
"кошка Кошка "
"кошка в"
"кот т"
"кошка"
до того, как вы начали подстригать хвост.
Теперь вернемся к тому, как работает free - free необходимо передать либо NULL, либо значение, которое вам передала одна из функций выделения кучи. Некоторые библиотеки выделения кучи реализованы так, что когда malloc выделяет данные, размер этого блока данных сохраняется в байтах непосредственно перед адресом, который возвращает malloc, и когда вы вызываете free, байты непосредственно перед этим указателем используются для определения того, что Размер этого блока памяти на самом деле. Если вы передадите что-то, что не было возвращено malloc (или calloc, или realloc, или подобным), то free может искать не в том месте и использовать все, что находит там, в качестве размера освобождаемого чанка - и ничего хорошего не получается этого.