从我的阅读和理解,例如当我们将一个字符串传递给一个函数时,在该函数内部我们不能使用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;
}
答案 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指针,这会引起你的注意。
同样由于这个原因,新字符串不会传回给调用者。