在C中使用Realloc
这确实是一篇关于realloc使用的建议,更具体地说,如果我能利用它简化我现有的代码。从本质上讲,下面所做的是动态分配一些内存,如果我超过256,那么数组的大小需要增加,因此我使用2倍大小的临时数组malloc,memcpy等(见下文) 我只是想知道realloc是否可以用在下面的代码中,为了简化它,任何关于如何实现它的建议、示例代码甚至提示都非常感谢 干杯在C中使用Realloc,c,memory,dynamic,realloc,C,Memory,Dynamic,Realloc,这确实是一篇关于realloc使用的建议,更具体地说,如果我能利用它简化我现有的代码。从本质上讲,下面所做的是动态分配一些内存,如果我超过256,那么数组的大小需要增加,因此我使用2倍大小的临时数组malloc,memcpy等(见下文) 我只是想知道realloc是否可以用在下面的代码中,为了简化它,任何关于如何实现它的建议、示例代码甚至提示都非常感谢 干杯 void reverse(char *s) { char p; switch(toupper(s[0])) { case 'A
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;
}Realloc正是您想要的-如果(i>=buffer\u size),您可以将
中的整个块替换为以下内容:
buffer = (char*)realloc(buffer, buffer_size*2);
buffer_size *= 2;
注意,这忽略了错误条件(如果realloc
的返回值为NULL
);捕获此条件留给读者。是的,realloc
可用于稍微简化代码。如果您对错误处理不感兴趣,那么:
char *tmp = malloc(size*2);
memcpy(temp, buffer, size);
free(buffer);
buffer = tmp;
本质上等同于:
buffer = realloc(buffer, size*2);
如果您对错误处理感兴趣(而且您可能应该感兴趣),那么您需要检查NULL
返回值。原始代码也是如此。是的,为了简化代码,您可以替换
if ( i >= buffer_size )
{
temp = (char*)malloc(buffer_size*2);
memcpy( temp, buffer, buffer_size );
free( buffer );
buffer_size *= 2;
buffer = temp;
}
与
这没有考虑到错误检查,因此您需要检查以确保realloc
不会返回NULL
是是。下面是它的外观:
if ( i >= buffer_size )
{
temp = realloc(buffer, buffer_size*2);
if (!temp)
reportError();
buffer_size *= 2;
buffer = temp;
}
请注意,您仍然需要使用临时指针来保存realloc()
的结果;如果分配失败,您仍然拥有指向仍然有效的现有缓冲区的原始buffer
指针。风格说明:您不应该强制转换malloc
的返回值。reverse
应该将参数作为const char*
realloc
可能返回NULL
,给你一个瞬间无法恢复的漏洞。如果realloc失败(返回NULL),您就失去了对原始块的引用。@GrahamBorland我说过您可以用该代码替换他的原始代码。他没有检查那里的NULL
,我也没有。但我添加了一条注释来提及它。如果realloc失败(返回NULL),您就失去了对原始块的引用。@Graham:我明确地说“如果您对错误处理不感兴趣”。OP在其原始代码中也没有任何错误处理。这种“错误处理”不仅仅是像检查std::cin>>n
这样的儿童游戏;这里的这个可能并且几乎肯定会导致UB…如果我错了,请纠正我,但是buffer=temp
,它不会复制到temp
内存地址上吗?因此,如果我在之后释放temp
,我也会释放缓冲区
?如果为true,我什么时候释放temp
变量以避免浪费分配两个相同字符串的内存?抱歉,我正在尝试了解这是如何工作的。
if ( i >= buffer_size )
{
temp = realloc(buffer, buffer_size*2);
if (!temp)
reportError();
buffer_size *= 2;
buffer = temp;
}