Что происходит с памятью после '\0' в строке C?

Удивительно простой/глупый/базовый вопрос, но понятия не имею:Предположим, я хочу вернуть пользователю моей функции 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;
}
64
задан Soner Gönül 19 April 2012 в 07:39
поделиться