2 つの文字列を連結するこの関数を stackoverflow で見つけました。関数は次のとおりです。
char* concatstring(char *s1,char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);
strcpy(result,s1);
strcat(result,s2);
return result;
}
私の質問は、なぜ malloc 呼び出しに 1 を追加するのですか?
2 つの文字列を連結するこの関数を stackoverflow で見つけました。関数は次のとおりです。
char* concatstring(char *s1,char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);
strcpy(result,s1);
strcat(result,s2);
return result;
}
私の質問は、なぜ malloc 呼び出しに 1 を追加するのですか?
これは、C では「文字列」が char の配列として格納され、その後に null バイトが続くためです。これは慣習によるものです。したがって、ヌル バイトは C 文字列内に表示されない場合があります。
ただし、実際の文字列自体には null バイト (文字列の表現の一部にすぎません) は含まれないため、文字列内のnull 以外のstrlen
バイト数が報告されます。したがって、2 つの文字列を連結した結果である C 文字列を作成するには、null ターミネータの余地を残す必要があります。
実際、すべての文字列操作は何らかの方法で null ターミネータを処理する必要があります。残念ながら、詳細は関数ごとに異なります (たとえばsnprintf
、正しく動作しますが、strncpy
危険なほどに異なります)。各関数のマニュアルを注意深く読んで、ヌル ターミネータを誰がどのように処理するかを理解する必要があります。
C で文字列を終了するために使用される '\0' (NULL 文字) にスペースを割り当てる必要があります。
つまり、文字列 "cat" は実際には "cat\0" です。
文字列が「cat」の場合:
char * mystring = "cat";
次に、strlen(mystring) は 3 を返します。
しかし実際には、mystring を格納するのに 4 バイト、null 文字を格納するのに 1 バイトが必要です。
したがって、"dog" と "cat" の 2 つの文字列がある場合、それらの長さは 3 と 3 になりますが、それらを格納するために必要なバイト数はそれぞれ 4 になります。それらの連結を格納するために必要なメモリは、3 + 3 + 1 = 7 になります。
したがって、malloc の 1 は、ヌル文字を格納するために余分なバイトを割り当てることです。