2015-08-30 5 views
-5

В этом коде с использованием a-- и b++ показаны ошибки сегментации, но если я даю --a и ++b его работу, почему ?!Почему я получаю ошибку сегментации (ядро сбрасывается) в следующем коде?

add(a,b) 
{ 
    if (a==0) 
     return b; 
    else 
     return add(a--,b++); //why this line didn't work??! 
} 
+7

Код не действителен C++. – juanchopanza

+0

можете ли вы рассказать нам, на каком языке вы программируете, и вставить сообщение об ошибке слишком –

+6

, это связано с тем, что операторы применяются в качестве постинкремента, а не для преинкремента. Когда переменная передается в стек для рекурсивного вызова, она должна быть увеличена сначала (не после) для завершения цикла – amdixon

ответ

5

Сообщение операторы инкремента и декремента на самом деле увеличения или уменьшения значения после того, как вычисляется выражение, означает, что она будет изменять значения a и b после того, как они были переданы в функцию.

Таким образом, вы будете в конечном итоге прохождение неизменные значения a и b к add() функции все время, которое будет вызывать переполнение стека (вызывая ошибки сегментации), так как это, по существу, рекурсивная функция, которая никогда не встречается возвращающегося состояние.

Ото, если вы используете Преинкремент или оператор декремента, значение a и b будет получать уменьшились, прежде чем они будут переданы рекурсивным add() вызова, тем самым удовлетворяя условию return, следовательно, ваша программа работает, как ожидался.

При этом вы должны указать тип возврата функции, например, в этом случае, int.

+0

Спасибо за ваш повтор. – manuel314ad

+0

@SouravGhosh Кто знает, может быть, если вы прочтете больше, то один раз комментарий/ответ можно было бы назвать переизданием тоже :)) – Michi

2

Да, проблема в том, что вы выполняете приращение/декремент сообщения, добавляя или вычитая ПОСЛЕ перехода в функцию. Вы действительно входите в бесконечный цикл, который, вероятно, дает вам ошибку сегментации.

Кроме того, определение вашей функции неверно.

Это должен быть ваш код:

int add(int a,int b) 
{ 
    if (a==0) 
     return b; 
    else 
     return add(--a,++b); 
     //or 
     //return add(a-1,b+1);  
} 
1

вина Сегментация относится к доступу к памяти за пределами выделенных границ. В настоящее время ваша функция вызовет StackOverflow, потому что функция add называется бесконечно до тех пор, пока указатель стека больше не будет продвинут дальше.

Существует, скорее всего, что-то еще, что вы не обнаружили здесь, в своем коде, который вызывает SegmentationFault.

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