0

行列を数える簡単なプログラムを作成しました。コードは次のとおりです。

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
int result[3] = {0,0,0};
int matrixc[3][6] = {
        {0,0,0,0,0,1},
        {0,0,0,1,1,1},
        {1,0,1,0,0,1}
        };
for(int x=0;x <3;x++)
{
    for(int y=0;y < 6;y++)
    {           
        result[x] += (matrixc[x][y] * pow(2,6-y));
    }
    cout << result[x] << endl;
}
}

出力は私が望んでいたものです2,14,and 82。しかし、整数配列の初期化を削除するとresult:

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
int result[3]; //deleted initialization
int matrixc[3][6] = {
        {0,0,0,0,0,1},
        {0,0,0,1,1,1},
        {1,0,1,0,0,1}
        };
for(int x=0;x <3;x++)
{
    for(int y=0;y < 6;y++)
    {           
        result[x] += (matrixc[x][y] * pow(2,6-y));
    }
    cout << result[x] << endl;
}
}

奇妙な出力が得られました: 1335484418,32618, and 65617.

初期化がある配列とない配列で出力が異なる理由を教えてください。

result実際には、行列の膨大なデータがあるため、すべての配列を初期化したくありません。

std::vectorすべてのresult配列を初期化せずに使用すると可能ですか?

4

5 に答える 5

6

初期化がある配列とない配列で出力が異なる理由を教えてください。

初期化しないと、自動変数は初期化されません。それらが占有するメモリに何があったかに応じて、不確定な値になります。

実際には、行列の膨大なデータがあるため、すべての「結果」配列を初期化したくありません。

次のように、配列が巨大であっても、配列全体をゼロで初期化できます。

int result[huge] = {};

ただし、それが巨大な場合は、自動変数であってはなりません。これらは通常スタックに保持されますが、スタックは通常それほど大きくなく、あまりにも多くのものを置くとオーバーフローする可能性があります。

すべての「結果」配列を初期化せずに std::vector を使用すると可能ですか?

はい、ベクトルはデフォルトでその要素をゼロで初期化します。

于 2013-05-10T16:37:06.220 に答える
1

配列の初期化を削除するとresult、これらの場所は最初は未指定の任意の値に設定されます。次に、ループ内でこの任意の値を追加すると、for予期しない結果になります。次にプログラムを実行すると、結果がまったく異なる場合があります。

また、result[x] += ...初期化されていない変数から読み取るため、初期化を削除すると、コードが未定義の動作をすることになります。

を使用するように切り替えると、次のvectorようにゼロ初期化できます

std::vector<int> result(count);  // zero initialized with `count` elements

また

std::vector<int> result; // contains zero elements
result.resize(count);    // now it contains `count` elements, all set to 0
于 2013-05-10T16:36:40.113 に答える
1

初期化を行わないと、result配列には未定の値が含まれます。つまり、int.

于 2013-05-10T16:36:08.137 に答える
1

コメントで述べたように、初期化しないresultと未定の値になります。後で、未知の値である未知の値に値を追加します。この状況では、データを初期化する必要があります。次のzeroように初期化できます。

int result[3] = {} ;
于 2013-05-10T16:37:45.057 に答える
1

初期化がある配列とない配列で出力が異なる理由を教えてください。

真剣に?配列要素を初期化しないと、初期化されません!

つまり、それらにはジャンクデータが含まれているため、result[x] += xxx;ジャンクに追加することになるため、より多くのジャンクが得られます.

実際には、行列の膨大なデータがあるため、すべての「結果」配列を初期化したくありません。

次に、初期値がゼロであることに依存しないでください。

あなたはこれを行うことができます:

int result[3] = { };  // initialize all elements to zero

すべての「結果」配列を初期化せずに std::vector を使用すると可能ですか?

std::vector常にメンバーを初期化します。

于 2013-05-10T16:38:48.337 に答える