关于这个问题,我有一些错误! 当我在Windows IDE中(例如代码块)进行编译时,会显示出垃圾值,但是每当在Linux中的Atom中进行编译时,我都会得到完美的结果!
那么,这里发生了什么问题?
#include<iostream>
using namespace std;
void getmat(int m, int n)
{
int p[m][n];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>p[i][j];
}
}
}
void display(int m, int n)
{
int p[m][n];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
int a,b;
cin>>a>>b;
getmat(a,b);
display(a,b);
}
1 2 3 4 5 6 7 8 9
答案 0 :(得分:1)
int p[m][n];
不是合法的C ++。因为在C ++中,数组维必须是编译时间常数。如果不是,则称为可变长度数组(VLA)。 VLA在C中合法,但在C ++中不合法。
即使忽略该问题,getmat
中的数组也与display
中的数组不同,即使它们具有相同的名称。它们是两个不同的数组。因此,没有期望将值输入一个数组会更改另一个数组的值。它只是在Atom中“起作用”,因为您很不幸,并且愚蠢地认为发生了有意义的事情。事实是,您的代码会显示未初始化的值,因此您可以看到任何内容。
答案 1 :(得分:0)
代码块或Visual Studio可能添加了一些功能,但是您的代码永远都无法按预期工作。
一旦您退出#include <iostream>
int main()
{
int x = 255;
void *buffer = &x;
int y = static_cast<bool>(*reinterpret_cast<int*>( buffer ));
std::cout << y << '\n';
}
方法,初始化的p[m][n]
就会超出范围。调用getmat(a,b)
方法时,它将初始化一个全新的display(a,b)
。这个新矩阵可以包含任何垃圾值。
代码块或Visual Studio可能具有内部功能,该功能使它们可以使用先前大小相同的矩阵中的值,而不使用垃圾值。这只是我的假设。您必须查看其内部代码以了解为什么会发生这种情况。
答案 2 :(得分:0)
该问题在其他答案中有所描述。一种可能的解决方案是:
#include <iostream>
#include <vector>
void getmat(std::vector<std::vector<int>>& p)
{
for(auto & row : p)
{
for(auto & cell : row)
{
std::cin >> cell;
}
}
}
void display(const std::vector<std::vector<int>>& p)
{
for(const auto & row : p)
{
for(const auto & cell : row)
{
std::cout << cell << " ";
}
std::cout << '\n';
}
}
int main()
{
int a,b;
std::cin >> a >> b;
auto p = std::vector<std::vector<int>>(a, std::vector<int>(b));
getmat(p);
display(p);
}
使用向量而不是c样式数组。将向量作为函数的引用。使用基于范围的for循环迭代向量。