【问题标题】:I'm not able to find what is causing the segmentation error in my C++ code我无法在我的 C++ 代码中找到导致分段错误的原因
【发布时间】:2020-03-30 17:24:47
【问题描述】:

我有一个 C++ 程序,我必须根据给定的要旋转的元素数 (x) 顺时针旋转数组。例如,如果输入数组是

[1,2,3,4,5]

鉴于必须旋转 2 个元素(表示为 x)。

输出数组应该是

[3,4,5,1,2]

代码:

#include <iostream>
#include<algorithm>
using namespace std;

int main()
{ 
   int t;
   cin>>t;
   while(t--){
       int n,x;
       cin>>n>>x;
       int a[n],b[x];
       for(int i=0;i<n;i++){
           cin>>a[i];
       }
      copy(a,a+x,b);
      copy(b,b+x,a+n);
      n=n+x;
      for(int i=x;i<n;i++){
          cout<<a[i]<<" ";
      }
   }
    return 0;
}

我在这里所做的是将给定数量的元素复制到一个新数组中。稍后将它们复制回从“n”开始的原始数组。所以我的数组看起来像 [1,2,3,4,5,1,2]。

稍后我将从索引“x”开始打印出数组。这样我的数组就会看起来像 [3,4,5,1,2]。

我能够编译程序并得到输出。但是在一个名为 GeekforGeeks 的网站上提交代码时,它的编译器抛出了一个分段错误 (SIGSEGV)。

【问题讨论】:

  • ??????小心前行,看看会发生什么?
  • copy(b,b+x,a+n) 不是要求在a 数组的end 之后复制数据吗?
  • 是的,它是 tadman
  • 提示:当您在数组边界之外写入时,您认为会发生什么?
  • 您需要一个编译器环境,例如 Visual Studio Express、Xcode,甚至是 Visual Studio Code + GCC 或 Clang。有很多选择,这些只是常见的例子。

标签: arrays gcc g++


【解决方案1】:

这个

int a[n],b[x];

不是标准的 C++。详情见这里:Why aren't variable-length arrays part of the C++ standard?。将std::vector 用于动态数组。

那么这里:

copy(a,a+x,b);

您使用x,但您用于a 的大小是n 而不是x。根据您的输入,这可能会越界访问数组。

接下来,这里:

copy(b,b+x,a+n);

您尝试复制到a+n,但a+n 已经超出a 的最后一个元素。数组有固定大小,n=n+x; 也无济于事。

要旋转数组(或std::vector)的元素,您可以使用std::rotate

【讨论】:

  • 是的,我将 a 的大小用作 n ..但在副本中我只需要开始数组 a 的 2 个元素。即 y im 使用 a+x ..x 包含要旋转的元素数。如果是 2.我只会复制数组“a”的起始 2 个元素
  • @SaiDarshan 不确定我是否理解您的意思。如果您参考我写的关于copy(a,a+x,b); 的内容,那么我写了这个 may 访问数组越界,并不意味着它总是失败。不过我永远不会写这样的代码,因为它看起来很无辜,但很容易失败并带来严重的后果(未定义的行为)。总之,copy(b,b+x,a+n); 肯定是越界访问,an 元素,不多
  • 是的,我同意副本(b,b+x,a+n)。如果我先增加数组大小然后执行此语句会怎样?
  • @SaiDarshan 数组有固定大小,所以我建议使用std::vector
  • 好的,我是 C++ 编程新手,能否给我链接一个演示程序如何使用矢量
【解决方案2】:

问题 1

线

  copy(a,a+x,b);

不做你想做的事。它将a 的第一个x 元素复制到b,没有偏移。如果x 为 2,则相当于:

 b[0] = a[0];
 b[1] = b[1];

你需要一些可以做的事情:

 b[0+x] = a[0];
 b[1+x] = a[1];

 ...

 b[n] = a[n-x-1];

为此,您需要使用:

 std::copy(a, a+(n-x), b+x);

问题 2

线

copy(b,b+x,a+n);

不对。

  1. 您想从a 复制到b,而不是从b 复制到a

  2. 使用a+n 会立即导致使用越界索引访问数组,从而导致未定义的行为。

  3. 该调用中使用的偏移量根本没有意义。

std::copy 的第一行执行后,你需要一些东西来做以下事情:

 b[0] = a[n-x];
 b[1] = a[n-x+1];

 ...

 b[x-1] = a[n-1];

为此,您需要使用:

 std::copy(a+(n-x), a+n, b);

【讨论】:

    【解决方案3】:

    数组必须有确定的大小 一些编译器接受您的代码,但其他不接受 所以尝试使用指针来代替

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      相关资源
      最近更新 更多