我想使用返回结果字符串的函数连接两个字符串。可能是这样的:
char *String_Concat (char *String_1, char *String_2)
{
char *StringResult;
//memmove String_1 to StringResult
//memmove String_2 to StringResult
return StringResult;
}
我不知道这是否是个好办法,因为我对内存管理知之甚少StringResult没有定义的长度,我不确定两次memmove操作后会发生什么。
我想StringResult将被函数本身清除,因为我不使用malloc(),对吗?
最佳答案
char *String_Concat (char *String_1, char *String_2)
{
size_t len1 = strlen(String_1);
size_t len2 = strlen(String_2);
char *StringResult = malloc(len1+len2+1);
//might want to check for malloc-error...
memcpy(StringResult, String_1, len1);
memcpy(&StringResult[len1], String_2, len2+1);
return StringResult;
}
所以,对于对象,C的概念是
storage
。对象的存储决定其生存期,因为C不是垃圾回收的。如果要创建新字符串,必须为其保留存储空间最简单的方法是自动存储,但这与它声明的函数的范围相关联,因此函数返回后自动变量停止存在。或者,可以使用静态存储,但不能是可变大小的,对函数的多个调用将使用同一个存储。最后,您可以使用分配的存储,这需要malloc()/calloc()/realloc()/free()
。见C11标准草案,章节
6.2.4 Storage durations of objects