在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
。