我在windows和Linux中得到了不同的结果!C++代码

我在windows和Linux中得到了不同的结果!C++代码,c++,C++,关于这个问题,我犯了一些错误! 当我在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++) {

关于这个问题,我犯了一些错误! 当我在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 1 2 3 4 5 6 7 8 9

intp[m][n];不是合法的C++。因为C++中的数组维数必须是编译时常数。如果不是,则称为可变长度数组VLA。VLAS在C中是合法的,但在C++中是不合法的。
即使忽略该问题,getmat中的数组与display中的数组也不相同,即使它们具有相同的名称。。它们是两个不同的数组。因此,不希望在一个数组中输入值会改变另一个数组的值。它只在Atom中“起作用”,因为你运气不好,被愚弄到认为发生了一些有意义的事情。事实上,您的代码会打印未初始化的值,因此您可以看到任何内容。

代码块或visual studio可能会添加一些功能,但您的代码永远不会按预期工作

一旦退出getmata,b方法,初始化的p[m][n]就会超出范围。当调用displaya,b方法时,它初始化一个全新的p[m][n]。这个新矩阵可以包含任何垃圾值


代码块或VisualStudio可能有一个内部功能,允许它们使用以前相同大小的矩阵中的值,而不是使用垃圾值。这只是我的假设。您必须查看它们的内部代码以了解为什么会发生这种情况

其他答案中描述了该问题。一种可能的解决办法是:

#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循环在向量上迭代。

getmat中的p和display中的p是两个完全独立的数组。您正在打印未初始化的内存。请注意int p[m][n];在标准C++中是非法的,因为N和M需要编译时常数。如果需要运行时大小的数组,请使用std::vector。要停止代码编译,请确保在GCC编译器选项中使用迂腐错误。@ Saffiun MiRaz可变长度数组不是C++的标准特征。在MUN中,在两个函数调用之间添加以下语句:CUT:此代码也在VisualStudio中工作,并且在Linux中也是次文本;Dint p[m][n]是g++最新版本中的一个工具。它起作用了!!也许他们为Java程序添加了此功能。请您也提供输出?@ShafiunMiraz Visual Studio代码和升华文本是编辑器,而不是编译器。您的代码仍然不正确。@ShafiunMiraz您想提到的任何编译器中的“它是否工作”都无关紧要。那只是运气不好。正如我所说的,你的程序的输出不是由C++语言指定的,所以如果一些编译器给你不同的结果,你就不能抱怨。