C++ 程序在 Linux 上完美运行,但不能在 Windows 上运行

Posted

技术标签:

【中文标题】C++ 程序在 Linux 上完美运行,但不能在 Windows 上运行【英文标题】:C++ program run perfectly on Linux but can't run on Windows 【发布时间】:2017-12-17 13:26:25 【问题描述】:

我的这段代码可以在 Ubuntu 16.04.3 LTS 上完美运行。但是当我在 Windows 上通过 Codeblock 构建和运行它时。这只是崩溃。我不知道我错了什么,我该如何解决这个问题。我写的很多 C++ 程序都可以在 Linux 上运行,但在 Windows 上就这样崩溃了。

Crashed Pricture

非常感谢你们的帮助!

#include <iostream>

using namespace std;

int d = 1;

void topRight(int [999][999], int, int, int, int);
void bottomLeft(int [999][999], int, int, int, int);

void topRight(int a[999][999], int x1, int y1, int x2, int y2) 
  for (int i=x1;i<=x2;i++) a[y1][i]=d++;
  for (int j=y1+1;j<=y2;j++) a[j][x2]=d++;
  if (x2-x1>0 && y2-y1>0)
    y1++;
    x2--;
    bottomLeft(a,x1,y1,x2,y2);
  


void bottomLeft(int a[999][999], int x1, int y1, int x2, int y2) 
    for (int i=x2;i>=x1;i--) a[y2][i]=d++;
    for (int j=y2-1;j>=y1;j--) a[j][x1]=d++;
    if (x2-x1>0 && y2-y1>0) 
        x1++;
    y2--;
        topRight(a,x1,y1,x2,y2);
    


int main(void)
  int a[999][999],m,n,i,j;
  cout << "Insert n: ";
  cin >> n;
  cout << "Insert m: ";
  cin >> m;
  topRight(a,0,0,n-1,m-1);
  cout << "\nA spiral-shaped two-dimensional array whith size " << m << " x " << n << " is: \n\n";
  for(i=0;i<m;i++)
    for(j=0;j<n;j++)
      cout << a[i][j] << "  ";
    
    cout << "\n";
  

我用这个命令在 Ubuntu 终端上编译:

g++ program.cpp -o program

然后用这个命令运行它:

./program

【问题讨论】:

你不应该将int [999][999]声明为函数参数,因为它不会做你认为它做的事情,你不应该在堆栈上创建像int a[999][999]这样的大数组。 学习使用调试器。 在 linux 上使用 -O3 -g 编译。那时它可能会崩溃。使用调试器找出位置。 推荐阅读:***.com/questions/46991224/… 只是猜测,但您在堆栈上分配了一百万个整数。那是4mib。对于 Windows 来说可能太多了(快速搜索显示 win 上的堆栈可以是 1mib)。尝试将这些数据放入堆中。 【参考方案1】:

当您声明 999x999 矩阵时,使用简单的数学运算:

999*999 = 998001

一个整数在内存中保存 4 个字节,所以

998001*4 = 3992004

几乎等于 4*10^6 字节。当您在主函数中声明变量时,它会尝试从堆栈中获取内存。在堆栈中,您不能提供这样的内存。这就是为什么您会收到 *** 错误。

尝试减小矩阵的大小或将此变量声明为全局变量。但是全局变量也有限制。

【讨论】:

我会试试的。感谢您的帮助 整数不是要求为4字节;它至少需要 16 位宽。现在许多编译器确实使用 4 字节整数,但同样,这不是必需的;有些没有。

以上是关于C++ 程序在 Linux 上完美运行,但不能在 Windows 上运行的主要内容,如果未能解决你的问题,请参考以下文章

我在 vb6(winsock) 中创建的客户端/服务器程序不能在 WAN 上运行,但可以在 LAN 上完美运行 为啥?

应用程序可以在模拟器上完美运行,但不能在物理设备上[在iOS 13.3.1上]

为啥这段代码可以在 Linux 上运行,但不能在 Windows 上运行?

为啥应用内购买方法可以在模拟器上完美运行,但不能在真实设备 iOS 6 上运行?

来自带有 Opencv C 程序的网络摄像头的灰色图像,但 C++ 程序完美运行

C++ 服务器 Linux 机器上的分段错误 - 适用于 Mac