2015-10-15 2 views
-1

Этот код работал, но какой-то компилятор выдает ошибку сегментации. Если я прокомментирую sumNumber, то ошибки не произойдет.ошибка сегментации в функции C и рекурсии

int sumNumber(int array[], int k); 


int main(void) { 

     int n; 
     static int num[MAX]; 

     int k; 

     scanf("%d", &n); 
     scanf("%d", &k); 


     for(int i = 0; i < n; i++){ 
      scanf("%d", &num[i]); 
     } 

     quick_sort(num,0,n-1); 
     printf("%d\n",sumNumber(num,k-1)); 

     return 0; 
    } 

int sumNumber(int array[],int k){ 


    if(k < 0){ 
     return 0; 
    } 
    return (array[k] + sumNumber(array,k-1)); 
} 
+2

Звучит как [переполнение стека] (http://stackoverflow.com/questions/33154028/segmentation-fault-in-c-and-recursion-function) для меня. –

+0

Насколько велик 'n'? – Barmar

+0

Возможно, есть ошибка в 'quick_sort'. Неправильные указатели могут оставлять бомбы замедленного действия, которые не срабатывают, пока не будет запущен какой-либо другой код. – Barmar

ответ

0

Я могу помочь.

Я смотрю на:

printf("%d\n",sumNumber(num,k-1)); 

и я смотрю на:

int sumNumber(int array[],int k){ 


if(k < 0){ 
    return 0; 
} 
return (array[k] + sumNumber(array,k-1)); 
} 

и на основе только этих двух фрагментов кода, ваша программа не будет работать всегда. Если значение k в printf выше, чем примерно пространство стека, необходимое для обработки функции, умноженной на выбранное вами значение, тогда вы столкнетесь с проблемой переполнения стека, которая может вызвать ошибку сегментации, поскольку вы пытаетесь написать в недопустимый адрес памяти.

То, что вы хотите сделать, чтобы избежать этого, либо ограничить число путем изменения:

int k; 

scanf("%d", &n); 
scanf("%d", &k); 

к:

int k=0; 

scanf("%d", &n); 
while (k==0 || k > 100){ 
    scanf("%d", &k); 
    if (k==0 || k > 100){ 
     printf("Number invalid\n"); 
    } 
} 

Таким образом, вы будете заставить пользователя ввести число от 1 до определенной суммы, которая в этом случае равна 100.

Другой вариант - изменить функцию sumNumber так, чтобы она не стала рекурсивной. Таким образом, вы можете позволить более высокие номера без проблем.

+0

спасибо, поэтому я попробовал, но это случилось снова int n; int num [MAX]; int k = 0; в то время как (п == 0 || п> MAX) { \t \t \t зсапЕ ("% d", &n); \t \t} \t \t в то время как (к == 0 || к> п) { \t \t зсапЕ («% d», &k); \t \t} –

+0

вы должны установить MAX, по меньшей мере ту же величину, независимо от п (первое число пользователь вводит, когда программа работает) – Mike

+0

Я вижу, что я решил эту проблему, пробовал ваш совет, но это случилось снова, поэтому в это время я поместил целое число в n и k, когда я поставил более 20000, но это случилось, но когда я поставил менее 10000, моя программа запустила i подумайте, что размер программы больше, чем я, хотя, в любом случае, спасибо за вашу помощь. –

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