C ++相同的数组 - 不同的输出

时间:2013-04-06 10:35:29

标签: c++

我正在尝试从文件(myfile.in)中读取一个2D数组。给出了行和列。

myfile>>n>>m; //rows and cols
for(int i = 0; i < n; i++) {
    for(int j =0; j < m; j++) {
    myfile>>tab[i][j];
    cout<<tab[i][j]<<" ";
    }
    cout<<endl;
}

并且屏幕上的输出应该是(因为它在文件中):

1 0 0 0 1 0 1
0 1 1 1 1 0 0
0 0 1 0 1 1 0
0 1 0 0 1 0 0
0 1 0 0 0 1 1
1 1 1 1 0 0 0
0 1 0 0 0 1 1

之后我试图分别打印阵列。

for(int i = 0; i < n; i++) {
    for(int j =0; j < m; j++) {
    cout<<tab[i][j]<<" ";
    }
    cout<<endl;
}

,输出为:

0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1
0 1 0 0 0 1 1

实际上它显示的是最后一行,为什么?

2 个答案:

答案 0 :(得分:2)

根据您的评论,您实际上是将标签初始化为tab[0][0]。我不知道编译器是怎么允许的,但重要的是你在数组边界外写字,触发undefined behavior

尝试在n和m中读取之后动态分配数组

int n, m;
file >> n >> m;

int **tab = new int* [n];
for(size_t i = 0; i < n; ++i)
{
  tab[i] = new int[m];
}

这样你就可以确保只分配你需要的内存。

另外,完成后不要忘记删除数组:

for(size_t i = 0; i < n; ++i) delete[] tab[i];
delete[] tab;

正如您所看到的,这种方法往往会增加太多不必要的复杂性。优雅的替代方案是使用容器,例如std::vector<std::vector<int>>

using namespace std;

vector<vector<int>> tab;

  for(int i = 0; i < n; ++i) {
    vector<int> current_row;
    for(int j = 0; j < m; ++j) {
      int buff;
      file >> buff;
      current_row.push_back(buff);
    }

    tab.push_back(current_row);
  }

答案 1 :(得分:1)

int n=0, m=0; int tab[n][m];

这不是合法的C ++,原因有两个:

  1. 数组的维度必须是常量表达式。 nm不是。

  2. 您正在创建一个0大小的数组。

      

    如果存在常量表达式(5.19),则其值应大于零。

  3. 您的编译器正在接受它,因为它具有接受这两者的扩展。尽管如此,您的数组大小为0,因此它没有元素。你试图写入它的任何东西都将超出数组的范围。

    阅读myfile>>n>>m;不会自动更改数组的大小。你已经宣布它的大小为0.你所做的一切都不会改变它。

    相反,您最好使用标准库容器,例如std::vector,它可以在运行时更改大小。考虑:

    myfile >> n >> m;
    std::vector<std::vector<int>> tab(n, std::vector<int>(m));
    

    然后,您可以使用此tab对象,方法与上面完全相同。