今日、私はchar **オブジェクトがメモリまたはバイナリ ファイルにどのように保存されるかを尋ねました。次のコード スニペットでテストしました。
char **array  = (char *)malloc(3 * sizeof(char *));
array[0] = "Foo";         // Length: 3
array[1] = "Long string"; // Length: 11
array[2] = "Bar";         // Length: 3   => Full length: 17
int length = 17;
この配列をファイルに書き込みます。
FILE *file = fopen(...);
fwrite(array, length, 1, file);
fclose(file);
すばらしいことに、次のコードを使用してファイルからこの配列を再度読み取ると、17 バイト以上を保存することなく、文字列の長さが正常に読み取られます。
FILE *file   = fopen(...);
int   length = 17;
char **array = (char *)malloc(length);
int index        = 0;
int parsedLength = 0;
while (parsedLength < length)
{
    char *string       = array[index];
    int   stringLength = strlen(string);
    printf("%i: \"%s\" (%i)\n", index, string, stringLength);
    parsedLength += stringLength;
    ++index;
}
次のような出力が得られます。
0: "Foo" (3)
1: "Long string" (11)
2: "Bar" (3)
コンパイラは、配列内の各文字列の長さをどのように認識しますか?