2016-09-04 3 views
-3

Проблема заключается в левом вращении в массиве.Почему ошибка сегментации в приведенном ниже коде C?

Первая строка содержит два целых числа, разделенных пробелами, обозначающие соответствующие значения n (число целых чисел) и d (количество левых поворотов, которое вы должны выполнить). Вторая строка содержит n целые числа, разделенные пробелами, описывающие соответствующие элементы начального состояния массива.

Мое решение:

#include <stdio.h> 
#include <malloc.h> 

int main() { 
    int n, d, i; 
    scanf("%d %d", &n, &d); 
    int *a = (int *)malloc(sizeof(int) * n); 
    int *temp = (int *)malloc(sizeof(int) * d); 
    for (i = 0; i < n; i++) 
     scanf("%d", &a[i]); 
    for (i = 0; i < d; i++) 
     temp[i] = a[i]; 
    for (i = 0; i < n - d; i++) 
     a[i] = a[i + d]; 
    for (i = 0; i < n; i++) 
     a[i + n - d] = temp[i]; 
    for (i = 0; i < n; i++) 
     printf("%d ", a[i]); 
    return 0; 
} 
+0

Вы игнорируете возвращаемое значение 'scanf'; фатальная логическая ошибка. –

+1

Что такое ввод? Вы всегда будете получать SIGSEGV, когда d> n. – 4pie0

+1

Используйте отладчик. Используйте debug printfs. Изучите базовые методы отладки (размещение сразу на SO не является отличной техникой отладки, несмотря на то, что многие думают). И, пожалуйста, выберите только соответствующие языковые теги. C и C++ не являются одним и тем же языком. – kaylum

ответ

0

Ваш код имеет некоторые проблемы.

Сначала вы сделали неявные утверждения в коде

for(i=0;i<n;i++) 
    scanf("%d",&a[i]); 
for(i=0;i<d;i++) 
    temp[i]=a[i]; 
      ^
     d should be <= n 

, что не правы: если d > n вы делаете доступ для чтения из выделенной зоны.

Такая же проблема в

for(i=0;i<n;i++) 
    a[i+n-d]=temp[i]; 
    ^  ^
2*n-d <= n and n <= d 
    n >= d for i = 0 

кода перед тем, malloc вызовов должна быть выполнена при условии

if (n > 0 && d > 0 && n < ... && d < ...) 

Я думаю, что вы можете предположить d = n написать первую версию алгоритма.

0

Код всегда терпит неудачу, если d > n, но он также терпит неудачу, если d < n: четвертый for цикл неверен, он должен остановиться на d:

for (i = 0; i < d; i++) 
    a[i + n - d] = temp[i]; 
Смежные вопросы