2015-11-10 4 views
0

Я не могу найти ошибку в моем коде. Когда я запустил его, он говорит о неисправности сегментации (ядро сбрасывается). Я читал темы, но не мог понять свою ошибку. Это в соответствующем каталоге. Я был бы очень благодарен, если кто-то может мне помочь.Ошибка сегментации (ядро сбрасывается) в моем коде

#include<stdio.h> 
#define MAX 50 

int main(){ 

    int i,n,j,t; 
    double a[MAX]; 

    do{ 
     printf("enter a lenght of your array"); 
     scanf("%d", &n); 
    }while (n<1 || n>MAX); 

    printf("enter the elements of your array"); 
    for (i=0; i<n; i++) { 
     printf("a[%d]= ", i); 
     scanf("%lf", &a[i]); 
    } 

    for(i=0;i<n/2;i++){ 
     for(j=n-1;j>n/2;j++){ 
      t=a[i]; 
      a[i]=a[j]; 
      a[j]=t; 
     } 
    } 

    for(i=0; i<n; i++) { 
     printf("%lf", a[i]); 
    } 
    return 0; 
} 
+2

Выполнить в отладчике, чтобы поймать аварию, и увидеть, где в коде это происходит. Затем проверьте значения переменных, чтобы попытаться выяснить, почему это происходит. –

+0

Вы должны проверить, что используемые индексы ('i' и' n') не находятся за пределами границ ('0 <= i agold

+0

Да, используя отладчик, вы узнаете, что строка сбойная: 'a [i] = a [j];'. Использование этого отладчика (или просто добавление printf значений i и j) показало бы вам, что j всегда увеличивается. В какой-то момент «a [j]' сбой. – hexasoft

ответ

4
for(i=0;i<n/2;i++){ 
     for(j=n-1;j>n/2;j++){  /* <--- This loop  */ 

В этом цикле вы должны уменьшаем j, так что j--.

Поскольку j=n-1 и вы увеличиваете его, и a имеют max количества элементов, поэтому этот цикл будет иметь доступ индекса вне границ и вызывает неопределенное поведение.

Итак, вы должны уменьшить j в петле.

+0

как я могу поменять первый и последний, второй и предпоследний в массиве? – Luka

+0

@ Luka Я не думаю, что для этого вам нужны две петли. Увеличивайте 'i' и уменьшайте' j' в одном цикле. Инициализируйте их как 'i = 0' и' j = n-1' и замените числа. – ameyCU

+0

@Luka Только этот цикл будет делать - 'для (i = 0, j = n-1; (i n/2); i ++, j -)' и выполняет обмен внутри этого цикла. – ameyCU

0

Проблемы в коде в строке

for(j=n-1;j>n/2;j++){ 

В этой строке вы увеличивающееся значение J за ее пределы выделенных. И вы пытаетесь получить доступ к [j]. Это пример Доступ к ограниченному массиву. т. е. вы пытаетесь получить доступ к этому элементу массива, который вы не объявили.

Возможно, что [j] находится в ячейке памяти, которая не принадлежит вашей текущей программе (что, вероятно, приведет к сбою вашей программы с чем-то вроде ошибки сегментации). Вероятно, это является причиной ошибки сегментации в вашем коде.

Edit: После запуска GDB на вашей программе, я обнаружил, что эта программа завершается с сигналом SIGSEGV

SIGSEGV является сигнал, посылаемый процессу, когда он делает недопустимую ссылку памяти или ошибки сегментации.

Я предлагаю вам также использовать GDB для отладки ваших ошибок

Смежные вопросы