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

C++ Same array - different outputs

本文关键字:输出 数组 C++      更新时间:2023-10-16

我正在尝试从文件 (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

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

根据您的评论,您实际上是在初始化选项卡以tab[0][0] .我不知道编译器为什么允许这样做,但重要的是你在数组边界之外编写,触发未定义的行为

尝试在读取 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);
  }
int n=0, m=0; int tab[n][m];

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

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

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

    如果常量表达式 (5.19( 存在,[...] 其值应大于零。

编译器正在接受它,因为它具有接受这两种扩展的扩展。尽管如此,您的数组大小为 0,因此它没有元素。您尝试写入的任何内容都将超出数组的范围。

读取myfile>>n>>m;不会自动更改数组的大小。您已经将其声明为大小 0。你所做的任何事情都不会改变这一点。

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

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

然后,您可以按照与上述完全相同的方式使用此tab对象。