1

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

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

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

4

2 回答 2

2

根据您的评论,您实际上正在将 tab 初始化为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);
  }
于 2013-04-06T10:41:47.703 回答
1
int n=0, m=0; int tab[n][m];

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

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

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

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

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

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

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

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

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

于 2013-04-06T10:42:29.163 回答