Удивительно простой/глупый/основной вопрос, но я понятия не имею. Предположим, я хочу вернуть пользователю мою функцию 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;
}