2

これは「どのように機能するか」という質問です。私の理解に基づいて、一定数の要素(int intarr [5])で非動的配列を初期化する必要があります。そうしないと、配列が他の何かに割り当てられる可能性のあるメモリブロックに上書きされます。

では、要素なしで文字列配列 (文字列 strArray[]) を初期化できるのはなぜでしょうか?

例:

#include <iostream>
#include <string>
using namespace std;

int main()
{
string s[] = {"hi", "there"};

cout << s[0] << s[1];
cin >> s[10]; //why is this ok?
cout << s[10];

return 0;
}
4

2 に答える 2

5

機能として、C++ (および C) では、初期化子を指定すると、要素数を指定せずに配列を宣言できます。コンパイラは、必要な要素の数を推測します。

だから

   int intarr[] = { 1,2,3,4,5};

コンパイラは、配列に 5 つの int の余地が必要であることを確認します。これは、次のように述べた場合とまったく同じです。

int intarr[5] = {1,2,3,4,5};

文字列配列もまったく同じです。

 string s[] = {"hi", "there"};

あなたが書いた場合と同じです

 string s[2] = {"hi", "there"};

ただし、コードには重大なバグがあります。

string s[] = {"hi", "there"};

cout << s[0] << s[1];
cin >> s[10]; //why is this ok?

cin >> s[10];絶対に大丈夫ではありません。配列sには 2 つの要素しかなく、たとえコンパイラがエラーを生成しなくても、使用することはできません。s[10] そうすると、未定義の動作が発生するため、動作しているように見えたり、クラッシュしたり、何でもできたりする可能性があります。

于 2013-09-17T20:29:22.260 に答える
0

string strArray[]2通りの使い方ができます

string strArray[] = {"apple","banana"};

また

void function(string strArray[]) {
    ...
}

最初のケースでは、配列のサイズは初期化子の数 (2) によって自動的に決定されます。2 番目のケースでは、配列のサイズは仮引数であるため必要ありません。

それ以外は、配列にサイズを宣言する必要があります。stringまたはに基づいているかどうかは関係ありませんint

例で書き込みをs[10]行っているが要素が 2 つしかない場合、未割り当てのメモリに書き込みを行っており、プログラムの動作は未定義です。クラッシュしないかもしれませんが、後で何か悪いことが起こります。

于 2013-09-17T20:27:53.073 に答える