2015-01-23 16 views
5

Piszę program w języku C i przekraczam limit rekursji przez błąd segmentacji. Czy istnieje sposób na zwiększenie limitu rekurencji programu (np. Poprzez zwiększenie rozmiaru stosu), albo poprzez opcję GCC, albo poprzez opcję wiersza poleceń? Program działa na Ubunutu.Czy istnieje sposób na zwiększenie limitu rozmiaru stosu/rekurencji?

+0

Masz na myśli, że przepełniasz stos, a co za tym idzie błąd segmentacji? –

+0

@iharob: Tak, zweryfikowałem to za pomocą 'gdb'. – Claudiu

+0

dlaczego nie piszesz iteracyjnie? – saadtaame

Odpowiedz

5

Można zmienić rozmiar stosu z ulimit na Linuksie, na przykład:

ulimit -s unlimited 

W systemie Windows z Visual Studio, użyj /Foption.

+1

@iharob: Pytanie jest oznaczone gcc, jeśli byłby to Windows prawdopodobnie zostałby oznaczony mingw. –

+3

'ulimit -s unlimited' tak naprawdę nie powoduje, że rozmiar stosu jest nieograniczony. Pozwala tylko na użycie maksymalnego skonfigurowanego limitu systemowego. – wallyk

+0

@PeterHorvath dzięki, więc wyjaśnij mi, co jest nie tak w mojej odpowiedzi. – ouah

2

Rozmiar stosu jest funkcją systemu operacyjnego, chociaż wiele wcześniejszych systemów operacyjnych (na przykład MSDOS) nie sterowało segmentami stosu programów: do programu zarezerwowano segment o odpowiedniej wielkości.

W przypadku pamięci wirtualnej i 32-bitowych interfejsów API rozmiar stosu jest zwykle zapewniany przez mechanizm zarządzania zasobami. Na przykład w systemie Linux komenda ulimit zapewnia jedno źródło kontroli rozmiaru stosu. Inne poziomy kontroli zapewniają mechanizmy wewnątrz zasad systemu egzekwowania jądra, ograniczenia pamięci i inne ograniczenia.

Powiązane problemy