Использование Realloc в C - PullRequest
       50

Использование Realloc в C

6 голосов
/ 30 ноября 2011

Это действительно пост с некоторыми советами относительно использования realloc, более конкретно, если бы я мог использовать его для упрощения моего существующего кода. По сути, то, что делает нижеприведенное, динамически распределяет некоторую память, если я превышаю 256, то размер массива необходимо увеличить, поэтому я выделяю временный массив с удвоенным размером, memcpy и т. Д. (См. Ниже).

Мне просто интересно, можно ли использовать realloc в приведенном ниже коде, чтобы упростить его, любой совет, пример кода или даже советы о том, как его реализовать, очень ценится!

Приветствие.

void reverse(char *s) {
char p;

switch(toupper(s[0])) 
{
    case 'A': case 'E': case 'I': case 'O': case 'U':
        p = s[strlen(s)-1];
        while( p >= s )
            putchar( p-- );
        putchar( '\n' );
        break;
    default:
        printf("%s", s);
        break;
}
printf("\n");
    }

    int main(void) {
char c;
int buffer_size = 256;
char *buffer, *temp;
int i=0;

buffer = (char*)malloc(buffer_size);
while (c=getchar(), c!=' ' && c!='\n' && c !='\t') 
{
    buffer[i++] = c;
    if ( i >= buffer_size )
    {
        temp = (char*)malloc(buffer_size*2);
        memcpy( temp, buffer, buffer_size );
        free( buffer );
        buffer_size *= 2;
        buffer = temp;
    }
}
buffer[i] = '\0';
reverse(buffer);

return 0;

}

Ответы [ 4 ]

12 голосов
/ 30 ноября 2011

Да - краткий ответ.Вот как это будет выглядеть:

if ( i >= buffer_size )
{
    temp = realloc(buffer, buffer_size*2);
    if (!temp)
        reportError();
    buffer_size *= 2;
    buffer = temp;
}

Обратите внимание, что вам все еще нужно использовать временный указатель для хранения результата realloc();если распределение завершится неудачно, у вас все еще будет оригинальный указатель buffer на все еще действующий существующий буфер.

1 голос
/ 30 ноября 2011

Да, realloc может быть использовано, чтобы немного упростить ваш код. Если вы не заинтересованы в обработке ошибок, то это:

char *tmp = malloc(size*2);
memcpy(temp, buffer, size);
free(buffer);
buffer = tmp;

по существу эквивалентно этому:

buffer = realloc(buffer, size*2);

Если вы заинтересованы в обработке ошибок (и вам, вероятно, следует), тогда вам нужно будет проверить NULL возвращаемых значений. Это верно и для вашего исходного кода.

1 голос
/ 30 ноября 2011

Да, чтобы упростить ваш код, вы можете заменить

if ( i >= buffer_size )
{
    temp = (char*)malloc(buffer_size*2);
    memcpy( temp, buffer, buffer_size );
    free( buffer );
    buffer_size *= 2;
    buffer = temp;
}

на

if ( i >= buffer_size )
    buffer = realloc(buffer, buffer_size *= 2);

Это не учитывает проверку ошибок, поэтому вам необходимо проверить, чтобы убедиться, чтоrealloc не возвращается NULL.

1 голос
/ 30 ноября 2011

Realloc в значительной степени именно то, что вы ищете - вы можете заменить весь блок внутри if ( i >= buffer_size ) на что-то вроде:

buffer = (char*)realloc(buffer, buffer_size*2);
buffer_size *= 2;

Обратите внимание, что это игнорирует условие ошибки (если при возвратеот realloc есть NULL);уловить это условие оставлено читателю.

...