Удивительно простой/глупый/базовый вопрос, но понятия не имею:Предположим, я хочу вернуть пользователю моей функции C-строку, длину которой я не знаю на момент начало функции. Сначала я могу указать только верхнюю границу длины, и в зависимости от обработки размер может уменьшиться.
Вопрос в том, есть ли что-то неправильное в выделении достаточного пространства кучи (верхней границы)и последующем завершении строки во время обработки намного меньше этого? т. е. если я вставлю '\0' в середину выделенной памяти, будет ли (a.)free()
по-прежнему работают должным образом, а (b. )становится ли пробел после '\0' несущественным? После добавления '\ 0' память просто возвращается или она сидит там, занимая место, пока не будет вызван free()
? Является ли вообще плохим стилем программирования оставлять это свободное пространство там, чтобы сэкономить некоторое время предварительного программирования, вычисляя необходимое пространство перед вызовом malloc?
Чтобы придать этому некоторый контекст, скажем, я хочу удалить последовательные дубликаты, например:
input "Hello oOOOo !!" --> вывод "Привет оОо!"
... и некоторый код ниже, показывающий, как я предварительно-вычисляю размер, полученный в результате моей операции, эффективно выполняя обработку дважды, чтобы получить правильный размер кучи.
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;
}