在C中使用Realloc

就realloc的使用而言,它确实是一个建议,更具体地说,如果我可以利用它来简化我现有的代码。 基本上,下面的内容,它动态分配一些内存,如果我超过256,那么数组需要增加大小,所以我malloc一个临时数组,大小2倍,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; 

}

的答案很简短。 这是它的样子:

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

请注意,您仍然需要使用临时指针来保存realloc()的结果; 如果分配失败,您仍然具有指向仍然有效的现有缓冲区的原始buffer指针。

Realloc几乎就是您正在寻找的东西 – 您可以使用以下内容替换if ( i >= buffer_size )中的整个块。

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

请注意,这会忽略错误条件(如果realloc的返回为NULL ); 抓住这个条件留给读者。

是的, realloc可用于略微简化您的代码。 如果您对error handling不感兴趣,那么:

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

基本上等同于:

 buffer = realloc(buffer, size*2); 

如果您对error handling感兴趣(并且您可能应该这样做),那么您将需要检查NULL返回值。 您的原始代码也是如此。

是的,为了简化您的代码,您可以替换

 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