不同的c++IDE会产生不同的结果

Different results in different c++ IDE

本文关键字:结果 c++IDE      更新时间:2023-10-16

我在compileonline.com和Xcode中执行了相同的代码,我在Xcode中得到了错误的结果,但在compilenline.com 中得到了正确的结果

对于以下代码

#include <iostream> 
using namespace std;
int main()
{
    int n=0,i,x[n],y[n];
    // insert code here...
    cout << "Enter number of inputsn";
    cin >> n;
    for (i=0;i<n;i++)
    {
        cin >> x[i];
        cin >> y[i];
    }
    //print x
    for ( i=0;i<n;i++)
    {
        cout << x[i];
    }
    cout << "Test1";
    //print y
    for ( i=0;i<n;i++)
    {
        cout << y[i];
    }
}

forhttp://www.compileonline.com/

输入:

1 5 6

输出:

输入输入的数量

5测试16

对于Xcode,

输入:

1 5 6

输出:

输入输入的数量

6测试16

int n=0,i,x[n],y[n];

这不会创建有效的数组。如果n0,则得到0大小的数组。大小为0的数组在C++中是无效的,因此如果您的代码进行编译,其行为是不可预测的。您希望稍后读取n并创建一个包含这么多元素的数组,但不能这样做。

相反,您应该首先读取n,然后可以制作如下数组:

int *x = new int[n];
int *y = new int[n];

看起来compileonline使用gcc,据我所知,Xcode使用gccclang,gcc和clang都支持flexible array member,但据我从gcc文档中所知:

灵活数组成员只能显示为结构的最后一个成员,否则该结构为非空

因此,这似乎不是一个有效的用途,如果您将代码更改为显式使用0大小并使用-Wall -Wextra -pedantic进行编译,您将看到类似于以下的消息:

警告:零大小数组是的扩展[-Wzero-length array]

所以我很困惑这是否有效,但你肯定是在通过访问数组边界之外的方法调用未定义的行为,所以你无法预测这段代码的结果。正确和有用的用途类似于gcc文档中的示例:

struct line {
   int length;
   char contents[0];
};
struct line *thisline = 
     (struct line *) malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

它在compileonline上工作很奇怪。

因为您的阵列xy的大小是0。在循环中,你试图设置每个数组的第i个元素(它不存在),那么你就有了一个未定义的行为。

这是越界错误的一个很好的例子。

然而,在cpp中,std::vector是首选(在大多数情况下):

#include <vector>    // for std::vector
int n=0,i;
//       ^ No x[n] and y[n]
cout << "Enter number of inputsn";
cin >> n;
std::vector<int> x(n);     // Create a vector x of size n
std::vector<int> y(n);     // Create a vector y of size n

通过您的输入查看这个实时示例