Удивительно простой/глупый/основной вопрос, но я понятия не имею. Предположим, я хочу вернуть пользователю мою функцию C-строку, длина которой я не знаю в начале функции. С самого начала я могу разместить только верхнюю границу длины и, в зависимости от обработки, размер может уменьшаться.
Вопрос в том, есть ли что-то неправильное при распределении достаточного пространства кучи (верхняя граница), а затем завершение строки, которая значительно меньше, чем во время обработки? т.е. если я вставляю '\ 0' в середину выделенной памяти, то (a.) free() все еще работает правильно, и (b.) делает ли пространство после "\ 0" несущественным? Как только добавляется "\ 0", возвращается ли память только в том случае, если она сидит там, пока не появится free()? Это вообще плохой стиль программирования, чтобы оставить это пространство для подвешивания там, чтобы сохранить некоторое предварительное время программирования, вычисляя необходимое пространство перед вызовом malloc?
Чтобы дать этот контекст, скажем, я хочу удалить последовательные дубликаты, например:
ввод "Привет, ооо!" → вывод "Helo oOo!"
... и некоторый код ниже, показывающий, как я предварительно вычисляю размер, полученный в результате моей операции, эффективно выполняя обработку дважды, чтобы получить размер кучи.
char* RemoveChains(const char* str)
{
if (str == NULL) {
return NULL;
}
if (strlen(str) == 0) {
char* outstr = (char*)malloc(1);
*outstr = '\0';
return outstr;
}
const char* original = str; // for reuse
char prev = *str++; // [prev][str][str+1]...
unsigned int outlen = 1; // first char auto-counted
// Determine length necessary by mimicking processing
while (*str) {
if (*str != prev) { // new char encountered
++outlen;
prev = *str; // restart chain
}
++str; // step pointer along input
}
// Declare new string to be perfect size
char* outstr = (char*)malloc(outlen + 1);
outstr[outlen] = '\0';
outstr[0] = original[0];
outlen = 1;
// Construct output
prev = *original++;
while (*original) {
if (*original != prev) {
outstr[outlen++] = *original;
prev = *original;
}
++original;
}
return outstr;
}