5

C99 コードのスニペットを次に示します。

int main(void)
{
    char c[] = "\0";
    printf("%d %d\n", sizeof(c), strlen(c));

    return 0;
}

プログラムは を出力して2 0います。すぐに終了する文字列リテラルであると定義したように、なぜ見ることをsizeof(c)意味するのかわかりません。誰かがなぜこれが当てはまるのか説明できますか? また、この現象を自分の時間でさらに調査できる (いくつかの) リソースを提供していただけますか。2cNULL

4

6 に答える 6

18

のサイズが 2 を示している理由がわかりませんでした。

文字列リテラルには暗黙の終了ヌル文字があるため、ch[]は実際には\0\0であるため、サイズは 2 です。セクション6.4.5 C99 標準 (ドラフト n1124) の文字列リテラル、5 節から:

変換フェーズ 7 では、値ゼロのバイトまたはコードが、文字列リテラルまたはリテラルから生じる各マルチバイト文字シーケンスに追加されます。

に関してはstrlen()、最初のヌル終了文字に遭遇するとカウントを停止します。sizeof返される値は、文字列を含む配列とは無関係です。の場合ch[]、配列の最初の文字がヌル ターミネータであるため、0 が返されます。

于 2013-08-14T07:30:35.087 に答える
3

C では、次のことを""意味します

たとえば、arr[] = "A"完全に同等ですarr[] = {'A', '\0'};

つまり"\0"null 終端を含む文字列を渡してから、null 終端してください。

arr [] = "\0""は同等です arr[] = {'\0', '\0'};

于 2013-08-14T08:25:00.313 に答える