C++ 相同的数组 - 不同的输出
C++ Same array - different outputs
我正在尝试从文件 (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++,原因有两个:
数组的维度必须是常量表达式。
n
和m
不是。您正在创建一个大小为 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
对象。
相关文章:
- 使用递归输出数组
- C++ 输出数组中的最高元素
- 空指针(为缺少的输出数组调用的 create() 在 create,文件 /home/m/OpenCV/modules/
- C++ 为什么我会得到垃圾输出数组?
- C 默认如何输出数组
- 使用递归输出数组
- 从 VB6 调用的 C++ DLL 函数中的输出数组参数
- 递归函数,用于输出数组的最小数量
- 如何在 c++ 中水平输出数组
- 冒泡排序未正确排序或输出数组值
- 按相反顺序输出数组的元素
- 制作一个排列函数,输出数组中所有可能的排列
- OpenCV (c++)缝合器不写入输出数组
- 创建一个3x3x3阵列.用0到9之间的随机值填充.输出数组.找出3个最小值和3个最大值的输出
- 实现[B,C]=f(A)语法(函数f作用于具有两个或多个输出数组的数组)
- 双指针输出数组参数异常
- SWIG Python C++输出数组给出'unknown type'错误
- 以 XLL 为单位获取调用方定义的输出数组尺寸
- c++:如何从函数接收可变长度的输出数组
- 未定义的符号 输出数组 opencv fedora.