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[x] += xxx;添加垃圾数据时,你会得到更多垃圾数据。

实际上,我不想初始化所有“结果”数组,因为我有大量的矩阵数据。

那么你不应该依赖它们的初始值为零。

你可以这样做:

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

如果我在不初始化所有“结果”数组的情况下使用 std::vector 是否有可能?

std::vector总是初始化它的成员。

于 2013-05-10T16:38:48.337 回答
1

如果没有初始化,result数组包含未确定的值,即可以是任何适合int.

于 2013-05-10T16:36:08.137 回答
1

当您删除result数组的初始化时,这些位置最初设置为未指定的任意值。然后,您在循环中添加到这个任意值for,并最终得到那些意想不到的结果。下次运行程序时,结果可能会完全不同。

此外,由于result[x] += ...从未初始化的变量中读取,删除初始化会导致您的代码具有未定义的行为。

如果您切换到使用 avector您可以将其初始化为零

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,它将具有未确定的值。稍后,您将向未知值添加一个值,该值仍然是未知值。在这种情况下你需要初始化你的数据,可以zero这样初始化:

int result[3] = {} ;
于 2013-05-10T16:37:45.057 回答