Почему приведенный ниже код дает проблему ошибки сегментации? - PullRequest
0 голосов
/ 28 августа 2011

Я пытаюсь найти минимальное число в массиве, используя рекурсивную функцию. Но мой код выдает ошибку сегментирования.

main()
{
    int a[5]={2,1,4,5,3};
    int n=1;
    fumi(a,n,a[0],5);
}

fumi(int a[],int n,int min,int t)
{
    if(n==t)
    {
        printf("%d",min);
    }
    if(a[n]<min)
    {
        min=a[n];
    }
    return(fumi(a,n+1,min,t));
}

Если я делаю что-то не так, а main не возвращает ничего, это не причина для сегментациинеисправность.

Ответы [ 3 ]

4 голосов
/ 28 августа 2011

вы также должны return после printf("%d",min);, в противном случае вы проверяете if (a[t] < min), а a[t] не было выделено.

fumi(int a[],int n,int min,int t)
{
    if(n==t)
    {
        printf("%d",min);
        return; //This line was added
    }
    if(a[n]<min)
    {
        min=a[n];
    }
    return(fumi(a,n+1,min,t));
}
2 голосов
/ 28 августа 2011

После выполнения

if(n==t)
{
    printf("%d",min);
}

Он не возвращается, вместо этого он продолжает выполнять:

if(a[n]<min)
{
    min=a[n];
}

Таким образом, когда базовое условие удовлетворяет, оно не возвращается.Поэтому функция fumi всегда вызывается рекурсивно.

Две причины segfault:

  1. Поскольку n выходит за пределы максимальной длины массива, запускается нераспределенная (недопустимая) памятьit
  2. Поскольку рекурсия не возвращается, мы получаем переполнение стека, приводящее к ошибке сегментации.

, в зависимости от того, что произойдет первым.

Поэтому исправление вашего коданеобходимо вернуться, когда встретится базовое условие:

if(n==t)
{
    printf("%d",min);
    return;
}
2 голосов
/ 28 августа 2011

Ваш код очень близок к работе. Причина сбоя заключается в том, что рекурсия никогда не останавливается и идет частично в конец массива.

Вы правильно проверяете на n == t и распечатываете результат, но после этого не возвращаетесь. Код продолжает работать до бесконечности. Простое добавление возврата после printf решает проблему:

void fumi(int a[],int n,int min,int t)
{
    if(n==t)
    {
        printf("%d",min);
        return; // stop recursing
    }
    if(a[n]<min)
    {
        min=a[n];
    }
    fumi(a,n+1,min,t);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...