1

私はこれを知っているべきですが、私は知らないし、おそらく私の基礎知識の大きなギャップだと思うので、専門家に尋ねるべきだと思いました.

与えられた:

 char s1[] = { 'M', 'y', 'W', 'o', 'r', 'd' };
 char s2[] = "MyWord";

cout << strlen(s1)<<endl;
cout << strlen(s2)<<endl;

cout << sizeof(s1)<<endl;
cout << sizeof(s2)<<endl;

s1asと宣言するとstrlen9 であるのに、as と宣言すると 6 になるのはなぜs2ですか? 余分な 3 はどこから来たのですか? null 終端文字がないためですか?

そして、s2にはnull文字が自動的に追加されるため、それsizeof(s2)は1バイト大きいことを理解していますか?sizeof(s2)

やさしくしてください、TIA!

4

6 に答える 6

7

char s2[] = "MyWord";"" 宣言のため、Auto は null ターミネータを追加します。

s1宣言はしません。strlenonを実行s1して 9 になったのは、最終的に \0 に遭遇して停止したためです。s1null で終了していないため、strlen と一緒に使用しないでください。s1 の strlen は 1,000 である可能性があります。メモリ違反検出をオンにすると、s1 の strlen がクラッシュします。

于 2012-05-20T14:46:55.230 に答える
7

最初のものには、2 番目のものに存在する暗黙の\0ターミネータがありません。したがって:

  • 1 つ目は12 つ目より小さく、メモリ的には
  • 最初に行うことstrlenは未定義の動作です(ターミネータがないため)
于 2012-05-20T14:46:55.553 に答える
2

あなたが言うようにヌル文字を終了していません。

strlen関数が on で呼び出されると、s1終了文字が見つかるまで文字をカウントします'\0'。メモリの初期化方法によっては、結果が異なる場合があります。

あなたの定義s2は実際には

char s2[] = { 'M', 'y', 'W', 'o', 'r', 'd', '\0' };
于 2012-05-20T14:47:03.883 に答える
2

s1 はたまたま 9 です。strlen は、終了文字列に対してのみ使用できます。char s1[] = { 'M', 'y', 'W', 'o', 'r', 'd', '\0' }; として宣言します。そして何が起こるか見てください。

于 2012-05-20T14:47:37.970 に答える
1

strlen(s1) は 6 より大きい任意の値を返すことができます。これは、彼が最初の '\0' 文字を検索していて、あなたがそれを提供しなかったためです。

于 2012-05-20T14:48:40.143 に答える
1

あなたのコードでは、

  • s1s2の配列ですchar
  • s1最後の要素は ですがds2最後の要素は\0です。

つまり、 にはもう 1 文字ありs2ます。これはヌル終了文字列ですが、ヌル終了文字列でs1はありません。

s1は null で終わる文字列ではないため、式は未定義の動作strlen(s1)呼び出し、最後の要素を超えて読み取りを続行します。strlens1

于 2012-05-20T15:29:59.603 に答える