在C中使用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

这确实是一篇关于realloc使用的建议,更具体地说,如果我能利用它简化我现有的代码。从本质上讲,下面所做的是动态分配一些内存,如果我超过256,那么数组的大小需要增加,因此我使用2倍大小的临时数组malloc,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;

}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;
}