0

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

对于以下代码

#include <iostream> 
using namespace std;
int main()
{
    int n=0,i,x[n],y[n];

    // insert code here...
    cout << "Enter number of inputs\n";
    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];
    }
}

对于 http://www.compileonline.com/

输入 :

1 5 6

输出 :

输入输入数量

5Test16

对于 Xcode,

输入 :

1 5 6

输出 :

输入输入数量

6Test16

4

3 回答 3

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

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

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

int *x = new int[n];
int *y = new int[n];
于 2013-08-29T20:03:37.273 回答
0

奇怪的是它可以在 compileonline 上运行。

因为你的数组xy的大小0。并且在循环中,您尝试设置i每个数组的第 th 元素(不存在),然后您有一个未定义的行为

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

但是,在 cppstd::vector中是首选(在大多数情况下):

#include <vector>    // for std::vector

int n=0,i;
//       ^ No x[n] and y[n]

cout << "Enter number of inputs\n";
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

用您的输入来查看这个实时示例

于 2013-08-29T20:51:16.813 回答
0

它看起来像compileonline使用gcc,据我所知Xcode使用gccclang support中的一个gccclang两个,但据我从文档中可以看出:flexible array membergcc

灵活数组成员只能作为非空结构的最后一个成员出现。

所以这似乎不是一个有效的用途,如果您更改代码以显式使用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;
于 2013-08-29T20:23:27.300 回答