将数据类型从 int 更改为 long long int 时出现运行时错误

时间:2021-02-15 06:01:30

标签: c++

在一个 codechef 问题中Maximise Function
我的问题代码是:

<块引用>
#include<iostream>
#include<math.h>
using namespace std;
void swap(long long int *x, long long int *y)
{
  long long int temp = *x;
  *x = *y;
  *y = temp;
}
void BubbleSort(long long int n, long long int a[])
{
//    long long int i, j;
  for(long long int i=0; i<n-1; i++)
  {
      for(long long int j=0; j<n-i-1; j++)
      {
          if(a[j]>a[j+1])
          {
              swap(a[j], a[j+1]);
          }
      }
  }
}
int main()
{
  long long int k;
  cin>>k;
  while(k--)
  {
      long long int n;
      long long int a[n];
      cin>>n;
      for(long long int i=0; i<n; i++)
      {
          cin>>a[i];
      }
      BubbleSort(n ,a);
      cout<<2*abs((a[n-1]-a[0]))<<"\n";
      
  }
  return 0;
}


当使用 int 作为下面所有变量的数据类型时,代码在 CodeChef IDE 中运行良好,但是当数据类型更改为 long long int(由于给定的约束)时,CodeChef IDE 是给出运行时错误。我无法理解正在发生的问题。请帮我找出那个问题。
运行时错误:SIGEMT

1 个答案:

答案 0 :(得分:2)

  long long int n;
  long long int a[n];
  cin>>n;

您正在尝试创建大小为 n 的可变长度数组,其中 n 未初始化。因此 a 的大小将是一些垃圾值,对于您最终放入其中的输入来说可能太小,或者太大以至于它立即溢出堆栈。两者都不好。当您使用 int 时,这碰巧没有崩溃,真是太幸运了。

至少,将 long long int a[n]; 移到 cin>>n; 之后。

但是variable length arrays are not standard C++。考虑将其重写为使用 std::vector,或者使用 new[] 动态分配您的数组。然后添加一些错误检查,以防无法从输入中读取整数。

此外,您的 swap(a[j], a[j+1]); 不是调用您的交换函数(它需要指针,而您正在传递 long long ints),而是 std::swap。这可能是一件好事,因为 std::swap 实际上在这里工作并且通常会更有效率,所以你最好放弃你的。这是downside of using namespace std;,因为类似的事情可能会在您不注意的情况下发生。