为什么我使用数组获得不同的结果?

时间:2013-05-10 16:34:23

标签: c++ arrays math

我制作了一个简单的程序来计算矩阵,这是代码:

#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,是否可以使用?

5 个答案:

答案 0 :(得分:6)

  

您想解释一下为什么在有和没有初始化的数组之间输出会有所不同吗?

如果没有初始化,则不会初始化自动变量。它们具有不确定的价值,取决于它们占据的记忆中的情况。

  

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

你可以对整个数组进行零初始化,即使它很大,如下所示:

int result[huge] = {};

虽然,如果它很大,那么它不应该是一个自动变量。这些通常保留在堆栈上,这通常不是很大,如果你把太多东西放在它上面,它可能会溢出。

  

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

是的,默认情况下,矢量将零元素初始化。

答案 1 :(得分:1)

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

答案 2 :(得分: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

答案 3 :(得分:1)

正如我在评论中提到的,如果你没有初始化result,它将具有未确定的值。稍后您将添加一个未知值的值,该值仍然是未知值。在这种情况下,您需要初始化数据,zero可以像这样进行初始化:

int result[3] = {} ;

答案 4 :(得分:1)

  

您想解释一下为什么在有和没有初始化的数组之间输出会有所不同吗?

真的?如果不初始化数组元素,则不会初始化它们!

这意味着它们包含垃圾数据,因此当您执行result[x] += xxx;时,您将添加到垃圾邮件中,因此您会获得更多垃圾邮件。

  

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

然后你不应该依赖他们的初始值为零。

你可以这样做:

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

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

std::vector始终初始化其成员。