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

时间:2019-07-11 12:50:11

标签: 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++)
    {
      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

3 个答案:

答案 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循环迭代向量。