strcat用于动态char指针

时间:2014-05-07 12:54:05

标签: c pointers memory

我需要在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内存时,它就崩溃了。如果我没有释放,那么为第一个分配的内存将被泄露(如果我理解得当)。

如何将返回值存储到同一个变量(第一个)?

3 个答案:

答案 0 :(得分:1)

"Testone"& "appendedfromhere"是字符串文字,常量。它们未使用malloc()calloc()realloc()分配,因此您无法free

答案 1 :(得分:1)

来自 7.20.3.2 C99标准的自由功能部分:

  

free函数导致ptr指向的空间被释放,即   可供进一步分配。如果ptr是空指针,则不执行任何操作。 否则,如果   参数与callocmalloc或之前返回的指针不匹配   realloc功能,或者如果通过调用freerealloc取消分配空间,   行为未定义。

str1(又名first由三个动态内存分配函数中的一个分配,导致崩溃。同样适用于second

  

如果不自由,那么为first分配的内存将被泄露(如果我理解的话)。

如果使用malloc()realloc()calloc()并且稍后内存不是free(),内存将会泄露。由于字符串文字"Testone"未动态分配,因此不得释放它。

请注意,在调用NULL之前检查指针free()是不需要的free(),如上所述,如果指针参数为NULL则不执行任何操作。


Do I cast the result of malloc?

答案 2 :(得分:0)

如果要将结果存储到str1(与strcat一样),则必须在外部分配连接字符串所需的内存。即str1(第一个)必须足够大才能保持第一个+第二个。由:

char first[100] = "Testone";

在c_strcat内部,你不分配也不释放任何内存,只需将str2末尾(' \ 0')写入str1。