0

いくつかのこと。

  1. size のメンバー配列で構造体を宣言すると、3配列に 4 つの要素があることを意味しませんか? 0、1、2、3? A、 、B、およびの文字を挿入しようとすると、なぜそれらが表示されるのCでしょinitializer-string for array of chars is too long [-fpermissive]うか。

    #include <iostream>
    using namespace std;
    
    struct Student {
        double no;
        char grade[3];
    };
    
    int main() {
        struct Student harry = {975, "ABC"};
    }
    
  2. 文字配列の特定のインデックスのアドレスを出力すると、次のコードから次の結果が得られます。

    struct Student {
        double no;
        char grade[4];
    };
    
    int main() {
    
        struct Student harry = {975, "ABC"};
    
        for (int i = 0; i < 4; i++)
            cout << "h.g[" << i << "]" << harry.grade[i] << endl;
    
        for (int i = 0; i < 4; i++)
            cout << "h.g[" << i << "]" << &harry.grade[i] << endl;
    }
    

結果:

h.g[0]A
h.g[1]B
h.g[2]C
h.g[3]
&h.g[0]ABC
&h.g[1]BC
&h.g[2]C
&h.g[3]

最初のループのように、各文字が個別に表示されるのではなく、最初のインデックスがABC、次になどを出力するのはなぜですか?BC

4

2 に答える 2

3

いいえ、次のように配列を宣言するT arr[3]と、4 要素ではなく 3 要素の配列が得られます。宣言の 3 は配列のサイズです。インデックスは 0 から始まるため、要素のインデックスは 0、1、および 2 です。

文字列リテラルは、最後の要素が null 文字である「"ABC"4 の配列」を提供します。const char文字数が多すぎる文字列リテラルで配列を初期化しようとすると、プログラムの形式が正しくありません。

配列要素よりも多くの初期化子があってはなりません。

最初のループでは、配列の各文字を取得して出力しています。を印刷すると、charそれだけがchar出力として得られます。

配列の要素のアドレスを で&harry.grade[i]取得すると、 が得られますchar*。を出力するchar*と、I/O ライブラリはそれを C スタイルのヌル終了文字列として扱います。その文字から最初に見つかったヌル文字までを出力します。そのため、位置iの文字とそれに続く文字を取得します。

于 2013-02-07T21:10:33.657 に答える
1

サイズ 3 のメンバー配列で構造体を宣言すると、配列に 4 つの要素があることを意味しませんか? 0、1、2、3?

いいえ、インデックス 0、1、2 でアクセスできる 3 つの要素があることを意味します。

最初のループのように各文字を個別に表示する代わりに、最初のインデックスが ABC、次に BC などを出力するのはなぜですか?

配列の境界を超えてアクセスしているため、未定義の動作が発生します。つまり、何でも起こり得るということです。また、サイズ 4 の文字配列 を"ABC"サイズ 3 の配列に代入しています。したがって、結合の読み取りおよび書き込みアクセスがありません。 char 配列「ABC」の 4 番目の要素は null-termination\0です。char[N]withの任意の要素のアドレスを出力すると、ヌル終了文字列として解釈される astd::coutが表示されます。char*そのため、null 終端までの文字が出力されます。したがって、最初から印刷すると、A, b, C. 2 番目の要素から出力すると、次のB,Cようになります。

于 2013-02-07T21:10:09.257 に答える