0

配列を初期化するときは、文字列リテラルを使用することが可能であると読みました。ただし、初期化子が配列のサイズよりも大きい場合のリストの場合、エラーがキャッチされます。

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    char cAr2[3] = "ABC";
    for (int i = 0; i < 3; i++)
        cout<<cAr2[i]<<endl;
    system("pause");

    return 0;
}

さて、この例は私の本にあります。実際には次のように終了します。エラーC2117:'cAr2':配列の境界がオーバーフローします。

ここで何が起こっているのか教えてください。3つの要素と3つの要素の配列がそこに配置されているのがわかります。すべてが大丈夫のようです。なぜエラーですか?

4

4 に答える 4

3

簡単な答えは次のとおりです。イニシャライザを使用する場合は、多少の手間を省いてサイズを省略します。

より長い答えは、文字列が null で終わるということです。つまり、文字列の末尾に表示されない追加の文字があることを意味します。したがって、サイズ n+1 の配列が必要になります。ここで、n は表示される文字数です。

于 2013-01-15T16:50:00.753 に答える
3

文字列リテラル"ABC"は、「4 の配列」を提供しますconst char。文字列がヌル文字で終了しているため、4 文字あります。つまり、初期化は次のようになります。

char cAr2[] = {'A', 'B', 'C', '\0'};

null 文字は文字列の末尾に暗黙的に追加されるため、配列の内容をループするアルゴリズムは、文字列の長さを明示的に指定しなくてもいつ停止するかを知ることができます。

于 2013-01-15T16:50:26.120 に答える
1

サイズ3は、「ABC」文字列に対して十分な大きさではありません。

 char cAr2[3] = "ABC"; 

この文字列をnullターミネータとともに格納するには、少なくとも4文字が必要です。

コンパイラがそれを自動修正したとしても(私にはわかりませんが)、配列のサイズを小さくすることはお勧めできません。

于 2013-01-15T16:49:05.130 に答える
-2

文字列リテラルを使用して初期化する場合は、次のようにする必要があると思います。

char *cAr2 = "ABC";

ただし、同じタイプを保持したい場合は、次のようにします。

char cAr2[3] = { 'A', 'B', 'C' };
于 2013-01-15T16:53:11.417 に答える