0

文字列を別の文字列に追加する関数があります。

char* strjoin(char* str1,const char* str2) {
  long len1 = strlen(str1);
  long len2 = strlen(str2);
  char* result = (char*)malloc(len1+len2+1);

  memcpy(result,str1,len1+1);
  memcpy(result+len1,str2,len2+1);

  free(str1); <--------- program crashes here with error: invalid pointer
  return result;
}

そして、上記の関数を呼び出すコードは次のようになります。

char* str = "John";
str = strjoin(str,"\x20");
str = strjoin(str,"Doe");

上記の関数strjoinでは、新しい文字列にメモリを割り当てるので、古いstr1を解放します。str1が無効なポインタであるのはなぜですか?

4

1 に答える 1

5

最初の呼び出しでjoinは、読み取り専用の文字列リテラルへのポインタをに渡しますfreefree解放されるメモリを割り当てていない限り、呼び出してはいけません。

これは、呼び出し元で次を使用して修正できますstrdup

char* str = strdup("John");
str = strjoin(str,"\x20");
str = strjoin(str,"Doe");
于 2012-08-23T04:15:39.947 に答える