#include <stdlib.h> #include <stdio.h> unsigned int zjadaj_stos(int n, unsigned k) { if (n > 0) { k+=n; return k + zjadaj_stos(n - 1, k); } else { return 0; } } int main(int argc, char * * argv) { int n=1; if (argc != 2) { printf("Użycie: %s głębokość_rekursji\n", argv[0]); } else { n = atol(argv[1]); } printf("wynik (bez sensu) %ud\n", zjadaj_stos(n, 0)); return 1; }Domyślne ograniczenie na wielkość stosu pod Linuxem to 8192 kB. Zmieniając wartość `n' i sprawdzając czy program da się wykonać ustalić zapotrzebowanie (jednej generacji) procedury `zjadaj_stos'. Porównać to z kodem asemblerowym (z `gcc -S').
Wykonanie poniższego programu kończy się błędem. Dlaczego?
#include <stdio.h> typedef struct { char t[20000000];} sa; sa x; void fun(sa y) { putchar(y.t[0]); } int main(void) { x.t[0] = '\n'; fun(x); return 0; }
Poniższa funkcja rekursywna może być wywołana z dużą wartością `k' bez przepełnienia stosu (użyć opcję `-O' przy kompilacji). Dlaczego?
unsigned int rec_sum(unsigned int a, int k) { if (k>0) { return rec_sum(a+k, k-1); } else { return a; } }
Funkcja:
void przerob_zlepek(char * s1, char * s2) { char bufor[500]; sprintf(bufor, "%s (i %s)"); rob_cos(bufor); }jest niebezpieczna (zakładamy że `rob_cos' jest zadeklarowana i poprawna). Przerobić tą funkcję tak by albo wykonała się poprawnie, albo wezwała `exit'. Wskazówka: przeczytać opis `snprintf'.