我需要在C中编写一个strcat。我尝试了以下内容:
char * c_strcat( char * str1, const char * str2)
{
char * ret = (char *) malloc(1 + strlen(str1)+ strlen(str2) );
if(ret!=NULL)
{
strcpy(ret, str1);
strcat(ret, str2);
if(str1 !=NULL) free str1; // If I comment this everything will be fine
return ret;
}
return NULL;
}
int main()
{
char * first = "Testone";
char *second = "appendedfromhere";
first = c_strcat(first,second);
if(second !=NULL) free(second);
// I want to store the result in the same variable
}
每当我释放c_strcat函数中的str1内存时,它就崩溃了。如果我没有释放,那么为第一个分配的内存将被泄露(如果我理解得当)。
如何将返回值存储到同一个变量(第一个)?
答案 0 :(得分:1)
"Testone"
& "appendedfromhere"
是字符串文字,常量。它们未使用malloc()
,calloc()
或realloc()
分配,因此您无法free
。
答案 1 :(得分:1)
来自 7.20.3.2 C99标准的自由功能部分:
free
函数导致ptr
指向的空间被释放,即 可供进一步分配。如果ptr
是空指针,则不执行任何操作。 否则,如果 参数与calloc
,malloc
或之前返回的指针不匹配realloc
功能,或者如果通过调用free
或realloc
取消分配空间, 行为未定义。
str1
(又名first
)不由三个动态内存分配函数中的一个分配,导致崩溃。同样适用于second
。
如果不自由,那么为
first
分配的内存将被泄露(如果我理解的话)。
如果使用malloc()
,realloc()
或calloc()
并且稍后内存不是free()
,内存将会泄露。由于字符串文字"Testone"
未动态分配,因此不得释放它。
请注意,在调用NULL
之前检查指针free()
是不需要的free()
,如上所述,如果指针参数为NULL
则不执行任何操作。
答案 2 :(得分:0)
如果要将结果存储到str1(与strcat一样),则必须在外部分配连接字符串所需的内存。即str1(第一个)必须足够大才能保持第一个+第二个。由:
char first[100] = "Testone";
在c_strcat内部,你不分配也不释放任何内存,只需将str2末尾(' \ 0')写入str1。