将字符附加到字符串末尾的函数

时间:2014-02-09 02:00:16

标签: c string realloc

从我的阅读和理解,例如当我们将一个字符串传递给一个函数时,在该函数内部我们不能使用sizeof(array)/ sizeof(array [0])来确定字符串的长度。所以我想知道这个函数在一个字符串末尾附加一个字符是正确的:

void append_ch_to_str( char *str, char ch )
{
    int length = strlen( str );

    str = ( char * )realloc( str, ( length + 1 ) * sizeof( char ) );

    length = strlen( str );

    *( str + length - 1 ) = '\0';
    *( str + length - 2 ) = ch;
}

2 个答案:

答案 0 :(得分:2)

这是不正确的,但可以按如下方式更正:

char *append_ch_to_str( char *str, char ch )
{
    int length = strlen( str );
    char *str2;

    str2 = ( char * )realloc( str, ( length + 2 ) * sizeof( char ) );
    if (!str2) {
        free(str);
        return NULL;
    }
    str = str2;

    str[length] = ch;
    str[length+1] = 0;

    return str;
}

所有这一切都假设str指针已经分配了malloc/calloc/strdup的内存。

分配应该为终止0字符提供空间,并为添加的字符提供一个空间。

字符串长度的第二次计算将产生相同的结果,因为它将计算非零的字符,并且不会返回分配的缓冲区的大小。

如果内存不足,您必须检查realloc是否返回NULL。编辑:我添加了检查realloc返回值 - 这将有望防止复制未完成的代码......

正如注释中所指出的,这也是一种糟糕的方法,因为realloc不能保证返回相同的指针值,这就是为什么函数将返回新的指针值,并且原始的指针值在执行后将不再有效。< / p>

答案 1 :(得分:1)

你将会发生内存泄漏,因为realloc可能会返回一个不同的str指针,这会引起你的注意。

同样由于这个原因,新字符串不会传回给调用者。