Я не могу найти причину ошибки сегментации в моем коде C ++ - PullRequest
0 голосов
/ 30 марта 2020

У меня есть программа на 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).

Ответы [ 3 ]

3 голосов
/ 30 марта 2020

Это

int a[n],b[x];

не является стандартным c ++. Подробности смотрите здесь: Почему массивы переменной длины не являются частью стандарта C ++? . Используйте std::vector для динамических c массивов.

Тогда здесь:

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.

0 голосов
/ 30 марта 2020

Задача 1

Линия

  copy(a,a+x,b);

не делает то, что вы хотите сделать. Копирует первые элементы x из a в 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);
0 голосов
/ 30 марта 2020

Массивы должны иметь определенный размер, некоторые компиляторы принимают ваш код, но другие не пытаются использовать вместо них указатели

...